+++ /dev/null
-{
-
- Copyright (C) 2002 Josh M. McKee, mrsnazz@users.sourceforge.net
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
-
-}
-
-{
- 1.0.0 JMc First release
- 1.0.1 JMc - Switched to using AddFormat for populating the formats table
- - Updated formats table to include currently supported formats
- - Switched to using CreateProcess rather than WinExec, so that
- we can display data from stderr to the user.
- 1.0.2 JMc - Added LoadFormats to call the new -^ switch, to dynamically
- load the supported formats from gpsbabel.exe.
-}
-
-unit gpsbabelfront_mainform;
-
-interface
-
-uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, StdCtrls;
-
-type
- TFormat = record
- sType:string; // type to be passed to GPSBabel
- sExt:string; // default file extension
- sDesc:string; // description of format
- end;
-
- TFormGPSBabelFront = class(TForm)
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- comboInput: TComboBox;
- editInput: TEdit;
- editOutput: TEdit;
- comboOutput: TComboBox;
- btnProcess: TButton;
- cbIgnoreShort: TCheckBox;
- Bevel1: TBevel;
- btnInput: TButton;
- btnOutput: TButton;
- OpenDialogInput: TOpenDialog;
- SaveDialogOutput: TSaveDialog;
- Label4: TLabel;
- Label5: TLabel;
- memoStdErr: TMemo;
- Label6: TLabel;
- procedure FormCreate(Sender: TObject);
- procedure btnInputClick(Sender: TObject);
- procedure btnOutputClick(Sender: TObject);
- procedure btnProcessClick(Sender: TObject);
- public
- formats:array of TFormat;
- nFormatCount:integer;
-
- procedure LoadFormats;
- procedure AddFormat(sType,sExt,sDesc:string);
-
- procedure PopulateCombos;
- procedure PopulateDialogs;
- end;
-
-var
- FormGPSBabelFront: TFormGPSBabelFront;
-
-implementation
-
-{$R *.dfm}
-
-procedure TFormGPSBabelFront.AddFormat(sType,sExt,sDesc:string);
-begin
- SetLength(formats,nFormatCount+1);
-
- formats[nFormatCount].sType := sType;
- formats[nFormatCount].sExt := sExt;
- formats[nFormatCount].sDesc := sDesc;
-
- inc(nFormatCount);
-end;
-
-procedure TFormGPSBabelFront.PopulateCombos;
-var
- i:integer;
-begin
- for i:=0 to nFormatCount-1 do begin
- comboInput.items.add(formats[i].sDesc);
- comboOutput.items.add(formats[i].sDesc);
- end;
-end;
-
-procedure TFormGPSBabelFront.PopulateDialogs;
-var
- i:integer;
-begin
- OpenDialogInput.Filter := '';
- SaveDialogOutput.Filter := '';
- for i:=0 to nFormatCount-1 do begin
- if (formats[i].sExt<>'') then begin
- OpenDialogInput.Filter := OpenDialogInput.Filter + formats[i].sDesc + ' (*.' +
- formats[i].sExt + ')|*.' + uppercase(formats[i].sExt) + '|';
-
- SaveDialogOutput.Filter := SaveDialogOutput.Filter + formats[i].sDesc + ' (*.' +
- formats[i].sExt + ')|*.' + uppercase(formats[i].sExt) + '|';
- end;
- end;
-
- OpenDialogInput.Filter := OpenDialogInput.Filter + 'All files (*.*)|*.*';
- SaveDialogOutput.Filter := SaveDialogOutput.Filter + 'All files (*.*)|*.*';
-end;
-
-procedure TFormGPSBabelFront.FormCreate(Sender: TObject);
-begin
- nFormatCount := 0;
-
- // load formats from GPSBabel.exe
- LoadFormats;
-
- if nFormatCount = 0 then begin
- ShowMessage('Unable to load format list from GPSBabel.exe. Default format list is being used instead.');
-
- // add the default formats
- AddFormat('geo','loc','Geocaching.com .loc');
- AddFormat('gpsman','','GPSman');
- AddFormat('gpx','gpx','GPX XML');
- AddFormat('magellan','','Magellan protocol');
- AddFormat('mapsend','','Magellan Mapsend');
- AddFormat('pcx','pcx','Garmin PCX5');
- AddFormat('mapsource','','Garmin Mapsource');
- AddFormat('gpsutil','','gpsutil');
- AddFormat('tiger','','U.S. Census Bureau Tiger Mapping Service');
- AddFormat('csv','csv','Comma seperated values');
- AddFormat('xmap','','Delorme Topo USA4/XMap Conduit');
- AddFormat('dna','dna','Navitrak DNA marker format');
- AddFormat('psp','psp','MS PocketStreets 2002 Pushpin');
- AddFormat('cetus','','Cetus for Palm/OS');
- AddFormat('gpspilot','','GPSPilot Tracker for Palm/OS');
- AddFormat('magnav','','Magellan NAV Companion for PalmOS');
- AddFormat('garmin','','Garmin serial protocol');
- AddFormat('mxf','mxf','MapTech Exchange Format');
- AddFormat('holux','wpo','Holux (gm-100) .wpo Format');
- AddFormat('ozi','ozi','OziExplorer Waypoint');
- AddFormat('tpg','tpg','National Geographic Topo .tpg');
- AddFormat('tmpro','tmpro','TopoMapPro Places File');
- end;
-
- // Set up the dropdown lists and open/save dialog filters using the formats
- PopulateCombos;
- PopulateDialogs;
-end;
-
-procedure TFormGPSBabelFront.btnInputClick(Sender: TObject);
-var
- sExt:string;
- i:integer;
-begin
- if opendialoginput.Execute then begin
- editInput.Text := opendialoginput.filename;
- sExt := uppercase(ExtractFileExt(editInput.text));
- for i := 0 to nFormatCount-1 do begin
- if '.' + uppercase(formats[i].sExt) = sExt then comboInput.ItemIndex := i;
- end;
- end;
-end;
-
-procedure TFormGPSBabelFront.btnOutputClick(Sender: TObject);
-var
- sExt:string;
- i:integer;
-begin
- if savedialogoutput.Execute then begin
- editOutput.Text := savedialogoutput.filename;
- sExt := uppercase(ExtractFileExt(editOutput.text));
- for i := 0 to nFormatCount-1 do begin
- if '.' + uppercase(formats[i].sExt) = sExt then comboOutput.ItemIndex := i;
- end;
- end;
-end;
-
-procedure TFormGPSBabelFront.LoadFormats;
-var
- sIgnoreShort:string;
- sCmd:string;
- f:file;
- Buffer:array[0..255] of char;
- hRead,hWrite:THandle;
- StartupInfo:TStartupInfo;
- ProcessInfo:TProcessInformation;
- saAttr:TSecurityAttributes;
- OutSt:TMemoryStream;
- dwRead:DWord;
- dwExitCode:cardinal;
- overlapped:TOverlapped;
- slstFormats:TStringList;
- i:integer;
-
- procedure ExtractFormat(sFormat:string);
- var
- toks:array[0..2] of string;
- i,nTok,nLen:integer;
- begin
- i := 1;
- nTok := 0;
- toks[0] := '';
- toks[1] := '';
- toks[2] := '';
- nLen := length(sFormat);
- while ((i<=nLen) and (nTok<3)) do begin
- if sFormat[i]=#9 then begin
- inc(nTok);
- end else begin
- toks[nTok] := toks[nTok] + sFormat[i];
- end;
- inc(i);
- end;
- {showmessage(toks[0]);
- showmessage(toks[1]);
- showmessage(toks[2]);}
-
- AddFormat(toks[0],toks[1],toks[2]);
- end;
-
-begin
- slstFormats := TStringList.Create;
-
- sCmd := 'GPSBabel -^';
-
- memoStdErr.lines.clear;
-
- saAttr.nLength := sizeof(TSECURITYATTRIBUTES);
- saAttr.bInheritHandle := true;
- saAttr.lpSecurityDescriptor := nil;
-
- if not CreatePipe(hRead, hWrite,@saAttr,0) then begin
- ShowMessage('Unable to create pipe!');
- Exit;
- end;
-
- AllocConsole;
-
- FillChar(StartupInfo,Sizeof(StartupInfo),#0);
- StartupInfo.cb := Sizeof(StartupInfo);
- StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
- StartupInfo.wShowWindow := SW_HIDE and SW_SHOWMINNOACTIVE;
- StartupInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
- StartupInfo.hStdOutput:= hWrite;
- StartupInfo.hStdError := hWrite;
-
- if not CreateProcess(nil,pchar(sCmd),nil,nil,true,CREATE_NEW_CONSOLE,nil,nil,StartupInfo,ProcessInfo) then begin
- ShowMessage('Unable to execute GPSBabel.exe.')
- end else begin
- while (WaitforSingleObject(ProcessInfo.hProcess,0)) <> WAIT_OBJECT_0 do;
-
- PeekNamedPipe(hRead,nil,0,nil,@dwRead,nil);
-
- if dwRead>0 then begin
- OutSt := TMemoryStream.Create;
-
- repeat
- if ReadFile(hRead, Buffer, 80, dwRead, nil) then begin
- OutSt.WriteBuffer(Buffer, dwRead)
- end;
- until dwRead<>80;
-
- OutSt.Seek(0,0);
- slstFormats.LoadFromStream(OutSt);
- for i:=0 to slstFormats.count-1 do begin
- ExtractFormat(slstFormats[i]);
- end;
- OutSt.Free;
- end else memoStdErr.lines.add('Command executed successfully.');
- end;
-
- CloseHandle(hRead); CloseHandle(hWrite);
- FreeConsole;
-end;
-
-procedure TFormGPSBabelFront.btnProcessClick(Sender: TObject);
-var
- sIgnoreShort:string;
- sCmd:string;
- f:file;
- Buffer:array[0..255] of char;
- hRead,hWrite:THandle;
- StartupInfo:TStartupInfo;
- ProcessInfo:TProcessInformation;
- saAttr:TSecurityAttributes;
- OutSt:TMemoryStream;
- dwRead:DWord;
- dwExitCode:cardinal;
- overlapped:TOverlapped;
-begin
- if (comboInput.ItemIndex)<0 then begin
- ShowMessage('You must select the input file format.');
- exit;
- end;
-
- if (comboOutput.ItemIndex)<0 then begin
- ShowMessage('You must select the output file format.');
- exit;
- end;
-
- if cbIgnoreShort.checked then sIgnoreShort := '-s' else sIgnoreShort := '';
-
- // The output file must exist, or else ExtractShortPathName will not function
- if not fileexists(editoutput.text) then begin
- system.assign(f,editoutput.text);
- system.rewrite(f);
- system.close(f);
- end;
-
- // Construct the command line to execute gpsbabel.exe. ExtractShortPathName
- // is used to reduce any "long" file/directory names in the paths down to
- // 8.3 dos format names (this removes spaces, etc).
- sCmd := 'GPSBabel '+sIgnoreShort+' -i '+formats[comboInput.itemindex].sType+' -f '+
- ExtractShortPathName(editInput.text)+' -o '+formats[comboOutput.itemindex].sType+' -F '+
- ExtractShortPathName(editOutput.text);
-
- memoStdErr.lines.clear;
-
- saAttr.nLength := sizeof(TSECURITYATTRIBUTES);
- saAttr.bInheritHandle := true;
- saAttr.lpSecurityDescriptor := nil;
-
- if not CreatePipe(hRead, hWrite,@saAttr,0) then begin
- ShowMessage('Unable to create pipe!');
- Exit;
- end;
-
- AllocConsole;
-
- FillChar(StartupInfo,Sizeof(StartupInfo),#0);
- StartupInfo.cb := Sizeof(StartupInfo);
- StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
- StartupInfo.wShowWindow := SW_HIDE and SW_SHOWMINNOACTIVE;
- StartupInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
- StartupInfo.hStdOutput:= hWrite;
- StartupInfo.hStdError := hWrite;
-
- if not CreateProcess(nil,pchar(sCmd),nil,nil,true,CREATE_NEW_CONSOLE,nil,nil,StartupInfo,ProcessInfo) then begin
- ShowMessage('Unable to execute GPSBabel.exe.')
- end else begin
- while (WaitforSingleObject(ProcessInfo.hProcess,0)) <> WAIT_OBJECT_0 do;
-
- PeekNamedPipe(hRead,nil,0,nil,@dwRead,nil);
-
- if dwRead>0 then begin
- OutSt := TMemoryStream.Create;
-
- repeat
- if ReadFile(hRead, Buffer, 80, dwRead, nil) then begin
- OutSt.WriteBuffer(Buffer, dwRead)
- end;
- until dwRead<>80;
-
- OutSt.Seek(0,0);
- memoStdErr.lines.LoadFromStream(OutSt);
- OutSt.Free;
- end else memoStdErr.lines.add('Command executed successfully.');
- end;
-
- CloseHandle(hRead); CloseHandle(hWrite);
- FreeConsole;
-end;
-
-end.
-
-
--- /dev/null
+object AboutBox: TAboutBox\r
+ Left = 713\r
+ Top = 118\r
+ BorderIcons = []\r
+ BorderStyle = bsNone\r
+ BorderWidth = 3\r
+ ClientHeight = 215\r
+ ClientWidth = 316\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = True\r
+ Position = poScreenCenter\r
+ Visible = True\r
+ OnCreate = FormCreate\r
+ OnShow = FormShow\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object pnlOuter: TPanel\r
+ Left = 0\r
+ Top = 0\r
+ Width = 316\r
+ Height = 216\r
+ BevelInner = bvLowered\r
+ BevelWidth = 4\r
+ Caption = 'pnlOuter'\r
+ TabOrder = 1\r
+ end\r
+ object pnlInner: TPanel\r
+ Left = 27\r
+ Top = 27\r
+ Width = 262\r
+ Height = 162\r
+ BevelInner = bvRaised\r
+ BevelOuter = bvLowered\r
+ BevelWidth = 2\r
+ ParentColor = True\r
+ TabOrder = 0\r
+ object lblVersion: TLabel\r
+ Left = 121\r
+ Top = 80\r
+ Width = 136\r
+ Height = 13\r
+ Alignment = taCenter\r
+ AutoSize = False\r
+ Caption = 'Version '\r
+ IsControl = True\r
+ end\r
+ object lblCopyright: TLabel\r
+ Left = 5\r
+ Top = 124\r
+ Width = 252\r
+ Height = 13\r
+ Alignment = taCenter\r
+ AutoSize = False\r
+ Caption = 'Copyright'\r
+ IsControl = True\r
+ end\r
+ object lblLicense: TLabel\r
+ Left = 5\r
+ Top = 137\r
+ Width = 252\r
+ Height = 13\r
+ Alignment = taCenter\r
+ AutoSize = False\r
+ Caption = 'License'\r
+ Layout = tlCenter\r
+ end\r
+ object lblProductName: TLabel\r
+ Left = 121\r
+ Top = 38\r
+ Width = 136\r
+ Height = 19\r
+ Alignment = taCenter\r
+ AutoSize = False\r
+ Caption = 'GPSBabelGUI'\r
+ Font.Charset = ANSI_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -15\r
+ Font.Name = 'Times New Roman'\r
+ Font.Style = [fsBold, fsItalic]\r
+ ParentFont = False\r
+ end\r
+ object ProgramIcon: TImage\r
+ Left = 11\r
+ Top = 10\r
+ Width = 110\r
+ Height = 110\r
+ Picture.Data = {\r
+ 07544269746D6170C6820000424DC6820000000000003604000028000000B400\r
+ 0000B40000000100080000000000907E0000232E0000232E0000000100000000\r
+ 0000B3D6E000ADD5DE00A7D4E000ADCEDE00A5CEDE009FCCE000ADCCD500A6CD\r
+ D500A4C8DC009DC6DB00A5C6D60099CCCC00A5C5CE009CC4D6009DC3CE009AC0\r
+ D4009BC5C600A9C3C40094C5C6009CBECE0094BDCE00A3BFC50094C5BD008FC2\r
+ C2009CBDC500A7BEBD0093BDC4009CBDBE0095BDBD009AB8C4008DBEBD0094B6\r
+ C6009DBAB6008CB5C50095BAB6009BB5BC0094B5BD008DB5BE00A3B6B5009CB5\r
+ B50093B5B50079AEC9008BB5B50093B0BB009CB4AF0084ACC60084B4B50083AE\r
+ BC0094AEB50094B2AD008CACBD008CB2AE008CADB50099AEAD0085ACB50094AD\r
+ AD0084ADAD008CACAD007BADAD0092ACA60079A4BC008DACA60083A6B50085AA\r
+ A7008AA6AC0092A7A4007BA3B40084A4AE007CA5AD008CA5A50084A5A60073A5\r
+ A5007BA3A6008DA39C0085A49D00799DAD008A9F9D00829EA3007B9CA500849D\r
+ 9C008B9E96007B9D9B007499A5006D9D9C00859B94007E9C95007B979C008398\r
+ 94006699990073959D00739596007B9494006B939000738E920070928C00738C\r
+ 8C006B8C8D00628C8D005A8B8C006C8985006B848400628483005A8382005384\r
+ 84005B7C7C00517B7B004A7B7A0051757300427373004A7271003D707000436B\r
+ 69003B6A6B00336666003A63630029585A002558580029555300215052001C4F\r
+ 4F001F4C4B00104A4A001949480011424100083A3A0000333300000000000000\r
+ 000000ECFD0020002200C22DF80070F1FC007294F8005894F800080200001A02\r
+ 000018A51A00080000000E0000000C0000000000000001350000100000000200\r
+ 00003477120008771200000000002E4502000100000064AAFF00000000004300\r
+ 00009E7512002000000040000000030000000000000020000800000000002000\r
+ 220000ECFD000000000043000000A07512000000000000000000200000000000\r
+ 0000A803130010A51A0000E0FD0000E0FD00E0771200A79DFB007894F800FFFF\r
+ FF00F07712001A02000008000000F0771200C22DF80070F1FC005696F8002E96\r
+ F80000ECFD000000000001800000000000000000000000000000000000000200\r
+ 000063003A005C00740065006D0070005C0073006800690070002E0067006900\r
+ 66000000000000000000000000007774E80090020000E8751200F07512000800\r
+ 00000E000000407D120020D6FF000A0000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000001000000000000407D12009720\r
+ 650090020000000000000000000001000000A544620090020000000000000100\r
+ 00001E456200407D1200000000000100000006734200407D1200407D120020D6\r
+ FF00000100000A000000D0CF1100A1B11A000067610054C1CE008553000000A1\r
+ F9000000000000000000C029F80000010000D80A600017000000A87800006C76\r
+ 12000B0B0B1010102A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A3F3F3F3F462A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A2A2A2A2A2A2A2A2A1E1E1E1E1212120B0B0B0B0B0B0B10101038383838\r
+ 3838383838333338383838383838383838383833333838383838383838383838\r
+ 3838333338383838383838383838383833333838383838383838333338383838\r
+ 3838383838383838383833333838383838383838383838383333383838383838\r
+ 3838383838383833333838383838383838383838383333383838383838383833\r
+ 3338383838383838383838383833333838383838383838383838383333332A2A\r
+ 2A1E1E1E1212120B0B0B0B0B0B10101C3F3F3F2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+ 2A2A2A2A2A2A2A2A2A2A2A2A2A3F3F3F3F3F33332A2A1C1C1212120B0B0B0B0B\r
+ 0B1212123F3F3F38383838383333383838383838383838383838333338383838\r
+ 3838383838383833383838383838383838383838333338383838383838383838\r
+ 3838333338383838383838383838383838383333383838383838383838383838\r
+ 3333383838383838383838383838383333383838383838383838383838333338\r
+ 3838383838383833333838383838383838383838383333383838383838383838\r
+ 384646463F3F3F333333221C1C12120B0B0B0B0B0B0B1010101C1E3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F464646463F3F3F3933281C\r
+ 1C1212120B0B0B0B0B0B12121C282A3F46464646463F3F3F3F3F3F3F4646463F\r
+ 3F3F3F3F3F3F3F3F46464646463F3F3F3F3F3F3F3F3F4646463F3F3F3F3F3F3F\r
+ 3F3F46464646463F3F46463F3F3F3F3F3F3F3F3F3F4646464646463F3F3F3F3F\r
+ 3F3F4646463F3F3F3F3F3F3F3F3F46464646463F3F3F3F3F3F3F3F3F463F4646\r
+ 463F3F3F3F3F3F3F3F3F46464646463F3F3F3F3F3F3F3F3F4646464646463F3F\r
+ 3F3F3F3F3F3F3F46464A4A4A4A3D3D3D333328281C1212120B0B0B0B0B101010\r
+ 1C282A3838383838333338383838383838383333383838383838383838383838\r
+ 3333383338383838383838383333383838383838383838383333383338383333\r
+ 3838383838333338383838383838333338383838383838383333383838383838\r
+ 3838383838383333383838383838383838383838333338383838383838383838\r
+ 38383333383838383838383838383838383333383838383838383838384A4A3D\r
+ 3D31313122221C1C1C12120B0B0B0B0B0B1010101C222A2A38613F3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F1B1B393F3F3F3F3F3F3F3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F\r
+ 38383838383F3F3F3F3F3F3F3F3F3F3F3F39313120202019191919101010100B\r
+ 0B0B0B0B0B10101C31313D3D3D31313D3D3F31313D3D3D31313D3D3F3F3F3F3F\r
+ 3F3F3F3F46464646463F3F3F3F3F3F3F3F3F4646463F3F3F3F3F3F3F3F3F4646\r
+ 463F3F33383838383338383846463F3F3F4646464646463F3F3F3F3F3F3F4646\r
+ 463F3F3F3F3F3F3F3F3F46464646463F3F3F3F3F3F3F3F3F463F4646463F3F3F\r
+ 3F3F3F3F3F3F46464646463F3F3F3F3F3F3F3F3F3F3F3F3F3F4A3F3F3F3F3F3F\r
+ 3F27272727272C2C2C2C2C2C201B1B1B101010100B0B0B0B0B12121211192020\r
+ 20202020202C1119202020202020201920352C1919192031313D3D3D31313D3D\r
+ 191B1B1B38383338383838333838381B1B1B1B0C0C1B1B1B1B1B1B1B1B1B1B1B\r
+ 0C0C0C0C00003838383833333838383838383838333338383838383838383838\r
+ 3838333338383838383838383838383833333838383838383838383838383333\r
+ 38383838383838383F3F3F3F3F3931313D3D31315E3B2C2C2C3B494945454545\r
+ 313128281C1212120B0B0B0B0B0B121219191920352C19192C3F19191920352C\r
+ 19192C31313D3D3D31313D3D1920202006000600000C0C0C1B1B1B1B1B1B1B1B\r
+ 1B1B1B0C0C0C0C03060C0C0C0C0C0C0C0C0C0C0C06060606061506000600003F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F\r
+ 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F38383838\r
+ 3831202020202020654F4F4F4F55555555554F464639392A1C1C1C120B0B0B0B\r
+ 0B1010101C281E100C1920202020202020202020202019111920202020202020\r
+ 1919060006000006150603060C0C0C0C0C0C0C0C0C0C0C060606060303030306\r
+ 030303030000110611060600060011061106153F3F3F3F3F3F3F3F3F46464646\r
+ 463F3F3F3F3F3F3F3F3F4646464646463F3F3F3F3F3F3F3F3F46464646463F3F\r
+ 3F3F3F3F3F3F3F46464631313D3D31312020202020202C19192C3B415555555B\r
+ 5B5B5B5B5B51514D4D3F392A2A1C1C120B0B0B0B0B1010101C22100C07191920\r
+ 352C19191920352C19191919191920352C19192C2C1911061106150003030003\r
+ 0606060606060606060606030306060303030303030006110600060000201106\r
+ 1106153131313D3D3D31313D3D3131313F3F31313D3D3D31313D3D3131313F3F\r
+ 3131313D3D3D31313D3D3131313F3F31313D3D3D31313D3D3131313F3F312020\r
+ 202020202C19192C3B4155555563685B5B5B5B5B5B5B5B5B5B51514D4646392A\r
+ 2A1C12120B0B0B0B0B10101C1C2210101019191920352C19191920352C191919\r
+ 1920352C19191920352C19191906000600000003030303030303030303030303\r
+ 030303060006030300060C191106110615191920203131201119202020202020\r
+ 2020202031312019202020202020202020203131201119202020202020202020\r
+ 2031312019202020202020202020203131202C19192C3B415B5B5B5B5B5B5B5B\r
+ 5B5D5D5D5D5B5B5B5B5B5B5B5B5B51514646382A2A1E17120B0B0B0B0B121212\r
+ 1C222828283D45455B656550505049495054545454545050505045352C2C4149\r
+ 491106110615060603030003060603030303000603030011060C0600002C452C\r
+ 19191920352C191941413B3B19191920352C19192C3B4141413B3B191920352C\r
+ 19192C3B4141413B3B19191920352C19192C3B4141413B3B191920352C19192C\r
+ 3B4141413B3B4F5B5B5B5D5D5D5D5D5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B\r
+ 5B5B51514646382A2A1E12120B0B0B0B0B0B12121C2833333D454A4A4F4F4F50\r
+ 5050505050505454545450505050494141414950505050504920110C06000006\r
+ 150C06000600000C0600002C2C2C455B4D4D4D4D4D4D4D4D4E4E4E4E4E4E5959\r
+ 4F3B3B4A55554F4F5A60606064646464645F5F5F4F3737454F4F454F5B5B4519\r
+ 19223F4F3B222222394F4F493B3B494F412C3B4F5B5B5B5B5B5B5F5F5F5B5B5B\r
+ 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B51514646382A2A1C1C12\r
+ 0B0B0B0B0B1010101C28333D3D45494950505050505050505050545454545450\r
+ 50505050505050505050505049412C2C455B201135201106110615412C2C455B\r
+ 5B5B5B5B5B5B5B5B5B5B5B5B5B5D5D5D5D5D5D5D5D5D5D5F6364646464646565\r
+ 65656464645F5F5F5F55555D5D5D5A5A5A56463B3B4D565656564D4D565D5D5D\r
+ 5B5B5B5B4F4F5B5D5D5D5D5F5F5F5D5D5D5B5B5D5D5D5D5D5D5D5D5D5D5D5D5D\r
+ 5B5B5B5B5B5B5B5B5B5B5B51514638332A1E17120B0B0B0B0B1010101C223333\r
+ 3D454C4C50505050505054545450505050505050505054545454545454545450\r
+ 505054505050412C49412C2C2C2C455B5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F63\r
+ 636364646464646464646465656565656564646464646464635F5F5F5F5F5F5F\r
+ 5F5A5A5A5A565656565A5D5D5D5D5D5D5D5D5D5F5F5F5F5D5D5D5D5D5D5D5D5D\r
+ 5D5D5D5D5D5D5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5D5D5D5D5D5D5D5B5B5B51\r
+ 514638332A1E17120B0B0B0B0B10101C1C2233333D45454C4C4C545454545454\r
+ 5454545454545454545454545454545454545454545450505054545454545454\r
+ 50505B5B5D5D5D5D5D5D5F5F5F5F5F5F5F5F5F5F636464646464646464656565\r
+ 6565646464646464646464635F5F5F5F5F5D5B5B5B5B5B5B5A5A5A5D5D5D5D5D\r
+ 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5F5F5F5F5F5D\r
+ 5D5D5D5D5B5B5B5B5B5B565656564D4D4D4D46393934342A1C1C12120B0B0B0B\r
+ 0B1212121C2233333D3D49495454545454545454545454545454545454545454\r
+ 5454545454505050505050505054545457575757575B5D5F5F5F5F5F5F5F5F5F\r
+ 5F5F5F5F5F5F5F5F63646464656565646464646464646464646464646464645F\r
+ 5F5D5D5D5D5B5B5B5B5B5B5B5D5D5D5D5D5D5D5D5B5B5B5B5B5B5D5D5D5D5D5D\r
+ 5D5D5D5D5D5D5D5D5D5D5D5B51515D5D5D5D5D5B55555B554A3D454530302318\r
+ 181818181818180C0C0C1C1C1010100B0B0B0B0B0B1212121C22333345454A4A\r
+ 5454545454545454545454545454545454545454545454545454545454545454\r
+ 54545457575757575B5B5D5F5F5F5F5F5F5F5F5F5F6363636363636363646464\r
+ 646464646464646464646464646464646464635F5F5D5D5D5D5D5D5F5F5F5D5D\r
+ 5D5D5D5A5A5A5A5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D564D\r
+ 4D4D554F4F4F4F454A4A4A452820201D0E15150C0C0C0C0C0C0C0C0C0C102222\r
+ 1C1212120B0B0B0B0B1010101C1C33333D454A4A545454545454545454545454\r
+ 54545454545454545454545454545B575757505050505757575757575D5D5D5F\r
+ 5F5F5F5F5F5F5F5F636363646464646464646464646464646464646464646464\r
+ 64646464645F5F5F5F5F5D5D5D5D5F5F5F5F5A5A5A5D5D5D5D5D5F5F5F5F5F5F\r
+ 5F5B5B5B5B5F5F5D5D5D5B5B5B5B55554C4039394545454545454545454A4A37\r
+ 23282824181119202015151520201515151C22221C1C12120B0B0B0B0B0B1212\r
+ 1C1C33333D3D4A4F4F4F57575757575754545454545454545454545454545454\r
+ 545B5B57575454545454545454545B5B5F6363635F5F5F636363636363646464\r
+ 6464646464646464646464646464646464646464646464645F5F5F5F5F5F5D5D\r
+ 5D5F5F5F5D5D5D5D5F5F5F5F5F5F5F5F5F5F5F5D5B5B5B5B5B5B5B554F4F4F4C\r
+ 4C393939303030373B414141454545454545452824343E342719273937202020\r
+ 20201B1B1B2222221C1C12120B0B0B0B0B0B12121C1C28333939454A4A4F5757\r
+ 57575757575757575757575757575454545454545B5B5B4F5757575757575B5B\r
+ 5B5B5F5F5F5F5F5F636363646464646464646464646464646464646464646464\r
+ 646464646464646464645F5F5F5D5D5D5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F\r
+ 5F5F5F5F5B5B5B5555564E4E4E4E45453B3B3B3B352727272731313D3D454545\r
+ 454545453740391B1B2F3E34271928453B262626261B1B1B2222221C1C101010\r
+ 0B0B0B0B0B1010101C1C2833333945454C4C4F54545454545454545457575757\r
+ 57575754545454545B5B574F54545454545B5B5B5B5F5F59525252595D636464\r
+ 64646464646464646565656565656464646464646464646464646464635F5F5F\r
+ 5F5F5F5F5F5F5F5F5F5F5F5F5F5D5D5D5D5D5D5B5B5B5B5B4F4F454A4A3E3E3E\r
+ 3E343535353541372727272727373D3D3D3D3D3D3D454537372828281D2F2F2B\r
+ 1B1B2737372626261B1B1B282828281C1C1010100B0B0B0B0B1010101C1C2828\r
+ 37373D45454C4C4C4C4C4C4F4F4F4F4F4F57575757575757575757575B5B5454\r
+ 545454545B5B5B5952525242424242525A646464646464646464646464646464\r
+ 6464646464646464646464636363636363636363635F5F5F5F5F5F5F5F5F5F5F\r
+ 5D5A5B5B5B5B5B4F4F4F4F4F45454545402F3E3E3E24273B3B3B3B2727272727\r
+ 3737454545453B3B3B3B3030301A1A34342F2F2323232327262626261B1B3028\r
+ 2828281C1C1010100B0B0B0B0B0B12121C1C282839394545454549494949494C\r
+ 4C4C4C4C4C4F4F57575757575757575B5B5B5457575757575B594B3C3C3C3C4B\r
+ 5D5D52595D646464646464646464646464646464646464646464646464646464\r
+ 64646464646363635F5F5F5F60606060605D5D5D5B515151464545454A4A4A4A\r
+ 4F4F4F45342F2F3E3418233B3B3728283527273745454545453B3B3B3B3B2828\r
+ 341F1F3232322B2020202026262C2C2C2C3131313128281C1C1010100B0B0B0B\r
+ 0B0B12121C1C282837373D45454549494949494949494949494F4F4F57575757\r
+ 5757575B5B575757575B4E4B4B4B3C3C42424B5A63635F5F5F5F636363646464\r
+ 646464646464646464646464645F6364646464646464635F5F5F5F5F5F5F5F60\r
+ 60605D5D564F4F4F45454545454545454A4A4A4F4F4F4F392F2F2F3E30151B37\r
+ 302327272727313B3B3B3B3B3B373737373728283424181F2D2D282020202626\r
+ 2C2C2C2C373737373728281C1C1C10100B0B0B0B0B0B10101C1C282837374141\r
+ 4141494945454545494949494949494F4F4F57575757575B5B4F4F575B4E3C29\r
+ 293C3C4B52595D5F63636363635F5F5F5F5F6363636464646464646464646464\r
+ 645D5D6464646464605F5F5F5F636363635F5F5B5B554C453B3B4A4A4A45454F\r
+ 4F4A4A4A4A4F4F4F4F4F45342F2F3E4334181828232323232330373737373737\r
+ 373737373730301A1A1A1A212D322326262626262C2C2C2C282828282828281C\r
+ 1C12120B0B0B0B0B0B0B10101C1C222231313B3B414141414141414545454545\r
+ 454545454C4F4F4F4F4F4F5B5B57574E3C29293C3C3C3C525A5F636363646464\r
+ 6363636363635F5F5F5F5F636364646464646464645D5D646464646464646060\r
+ 5D5D5A564D4D4D4545453B373D4A4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F3D34\r
+ 2D2F3E3E3931241D1D27272727373737373737373737373730302B1A0E0E1F2D\r
+ 2F2B1B262626262C272727282828282828281B1B1B12120B0B0B0B0B0B0B1010\r
+ 1C1C222231313B414141414141414141414145454545454C4C4C4C4C4C4F5B5B\r
+ 5B5B563C3C3C4B595952595D5F636363636363636363636363636363635F5F5F\r
+ 5F636363636363635F5F5F646464635F5F5F55392434343425303B3737373737\r
+ 454F4F4F4F4A4A4A4A45454F4F4F4F4F4F4539322D3E3E4037371C0E1B272727\r
+ 273737373737373737372727272424241A0E142D3E2319262626262626262C2C\r
+ 2C37373727271B1B1B12120B0B0B0B0B0B0B10101C1C22282837373B41414141\r
+ 414141414145454545454C4C4C4C4C4C4C4F5B55555D5D59595D5D5F5F5F5F64\r
+ 64646464636363636364646464636364646464636363636360606060605B5B5A\r
+ 5A5A514D4D4D3B15030E212121373B3B3B3B3B4545454545454545454545454D\r
+ 4D4D4D4D4545393E3E3E43373737241823232323313737373737373737272727\r
+ 23243434240E143C321B1B262727272727273137373737272020201C1C10100B\r
+ 0B0B0B0B0B0B10101C1C22282837373B3B4141414141414141454545454C4C4C\r
+ 4F4F4F4F4F4F5B5B5B5F5F5F6363635F5F5D5B5D606063636363636464646464\r
+ 646464636363636363635F5F5F5D5D5D5D5643434B4D45454545350C03081F25\r
+ 34393B3B3B3B454545454545454545454545454D4D4D4D454545342F3E3E403B\r
+ 3B302B28282828283737373737373737372727231D2534341D0D213C2B191926\r
+ 2C2C2020273737373737272020201C1C1010100B0B0B0B0B0B0B10101C1C2228\r
+ 31313B3B4145454545454545454545454F4F4F4F4F4F4F45454F5B5F5F5F5F5F\r
+ 5F5D5D564D404040464D4D56565B5D5D5D5B5B5B5B5B5B5B5656565B5B5B5B5B\r
+ 55554D4D4D4D3E3E3E4645454545310C0303133239393B3B3B45454545454545\r
+ 454545454545454D4D4D4D454545362D3E434039342525282828282837374545\r
+ 372C373727271B18181A25250A092D3E2323232C2C2626273737373737272727\r
+ 27271C1C1010100B0B0B0B0B0B0B1010101C222831313B3B4145454545454545\r
+ 4545454A4A4A4A4A4A4545454A5D5D5D5D5B5B5B5B4F45393030303025303737\r
+ 37414545453B393939394046464646564D454545454539394646424242464545\r
+ 4545350C0303031834393939454545454546464646463D3D454545454D4D4646\r
+ 4545362F2F43342B212128282828373737374C4C353535352727180E0E25250E\r
+ 04143C341920202020202037373737372626262727221C1C1010100B0B0B0B0B\r
+ 0B0B1010101C222831313B3B414545454141414141454A4A45454F4F45454545\r
+ 4F5D5D5D5D5D564F453730303037372525303737373B3B3B3B3B454545454545\r
+ 4545454E453737454545393946442F3E464545454545370C0303030318304040\r
+ 464646464646464645453B45454545464646454545403E2F3636321F1F343737\r
+ 28283939373746403030302727230E0D1F34340D08213C2B1927272727272737\r
+ 373737272727272722221C1C1010100B0B0B0B0B0B0B1010101C222831313B41\r
+ 41414141414141414C4C45454C4C454545453B45565D5D5D5B4D373737373030\r
+ 30303025253939454545454545454545454545454545454D453B3B4A4A4A3939\r
+ 4D442F3E4D4D49494949370C01040101061830404D4D4D4D4D4D4D453B3B3B45\r
+ 4545454545454545393936323232212121343728283737393939434337372727\r
+ 271808081F341F070D2D3E272727272727373737372C2626262C2C2323231C1C\r
+ 1010100B0B0B0B0B0B0B10101C1C222831313B3B414141414141454545454545\r
+ 4A454545454543424B4E403940463B3535353537373739393945454545454539\r
+ 39393941414141414141454545454545453939433E3E3E46464F4F45454C370C\r
+ 010401010A18243040404D4D4D4D453B3B3B4545454545454545453434323232\r
+ 3232212134393024303B3B3939393737373727271B0E0408242B0F030F293E27\r
+ 2727272727373737372626262C2C232322221B1B1010100B0B0B0B0B0B0B1010\r
+ 1C1C282831313B3B41414141414C4A4A4A45454545454D4D4B422F2F39392B28\r
+ 3745454537374545453939363639393930303030373741414141414141414141\r
+ 41393945453434362D2D434A454D4D4A4A4A3B15030303080D18182424344046\r
+ 46393030394545454545453934342B2B21212525252525253437271A25404039\r
+ 37373737372727271808040D32320A08143C3427272727273039393527272727\r
+ 27271B1B281B1B1B1B10100B0B0B0B0B0B0B10101C1C222831313B4141414145\r
+ 454545454545454D4D4D4D443E323437373737373745454D4545454539302525\r
+ 252537373737373741414141414141414141414141373745331C2B2F293C4B46\r
+ 39394F4F4F49411B0303080D0D1D242424243636251F1F1F343443393939321F\r
+ 1F1F1F1F1F25252525252532343023233436363636393B3B2C2727230E04040F\r
+ 211F0A0A2D2F30262626273739393527262626151B1B2323231B1B1B1010100B\r
+ 0B0B0B0B0B0B1010101C1C282837373B3B4145454545454545454B4B56564039\r
+ 39393D3D3D40404040373745453B3737371D1D21212130303737414141414141\r
+ 4141414141414141413737403424323C3C423E34343434464F4C412706060D0D\r
+ 14212121212525130D0F141F2532323232321F1F1F1F1F1F1F2B2B2B2B323232\r
+ 30302323393934252532404027272718040408131F1F13142D34272727273740\r
+ 403527262626261515232323231B1B1B1010100B0B0B0B0B0B0B1010101C1C28\r
+ 282837373B454C4C45454646464444445B5B4537414145393939373030303030\r
+ 3939353535180E2121213037373B414141414141414141414141414137373734\r
+ 34403E29423E212121212134464639280E0A0A0E1A1F1F1F1F1F0A03080D0D1F\r
+ 32321F1F25251F1F1F1F2525252525323232323234301D1D4040372824242121\r
+ 2B2B2B0C0303080E24342D292D302626263740403526262626262C2323232320\r
+ 20201B1B1010100B0B0B0B0B0B0B1010101C1C1C28282839454F4F46464B4242\r
+ 4234344A5B4F4539393939302424303030303030303D3D3D3D1D0A142525303B\r
+ 3B3B3B414141414141414141414141413739343232432F2D3E32131F32212121\r
+ 34433424180A0D1A1A1A1A1A1A0A010103030C1F251D1D1D251F1F1F1F1F1F2B\r
+ 2B2B2B343421213434281818343939373727130F213632140D04040D32432F2D\r
+ 2F3019233745453526262626262C2723232323232323231B1010100B0B0B0B0B\r
+ 0B0B1010101C1C1C1C2828454D4D4D4343433636333337454545373737372828\r
+ 1C2430303030303030304545391D0A0D1F252537414141414141454545414141\r
+ 414141413936323236362D2D3E1F0E252525252525343425180E1F1F1F1F1F1F\r
+ 080101010103131F1313131F1F14141F1F1F2B34342B2B323232323230241D1D\r
+ 3437373737371B152436362D140909142F34212D34231B374645352626262626\r
+ 2C271B232827202020201B1B1010100B0B0B0B0B0B0B1010101C1C1C28284046\r
+ 4843343434343737282828282828282828282828283428282323282828303939\r
+ 301D0E040A1F25343B3B3B3B3B3B45454541414141413934343221323E3E2D42\r
+ 3E0E08252525252525253434281A25251A21210801010101010E1F0E0A131313\r
+ 1313131F1F1F2B2B2B32323232323232342418182439393737272727271D1D21\r
+ 140F1F2F342B2F3E2B1B2745452C272727272727271B1B2828272727271B1B1B\r
+ 1010100B0B0B0B0B0B0B1010101C1C2834343E3E252428283737373724242427\r
+ 272727272727272730343423232323303030242434280E02020A1325343B3B3B\r
+ 3B3B3B3B3B3B3B3B393934323232323236362D42340A0A252525252525252546\r
+ 46282525251F0902010101010714140A0A131313131313131F1F2B2B2B2B3232\r
+ 323232323928180E1830303030272731280708130A0414322B343E3218183745\r
+ 3527272727272727271B283527272727271B1B101010100B0B0B0B0B0B0B1010\r
+ 101A1A2A2A1A1A2424243030303030301B1B282828282828282828282834342B\r
+ 2B30303030242424393918040404040D1D2B3939393939393939303434342532\r
+ 32323232362F2F422B030834342525252525344F4F392424240D010101010101\r
+ 0F1408040D0D0D08080D0D131F2424242432323232323232392B0E0E0E232837\r
+ 2C2727301801040D0D0D0D0D0F3E3E242424373727272727272727271B243030\r
+ 27272727271B1B101010100B0B0B0B0B0B0B1010101A1A252512182828282828\r
+ 282828281B1D2B28282828282828282839393232322B2B242424242437453007\r
+ 02020208080D141F1F2B3232323232323225323232323232362F2F3E18010A34\r
+ 342525252525404F4F4F2A1F0D0101020202020D140D040408080803030A0A13\r
+ 1F2424242424243232323232391D0E0E0A0A28372C2C37280A03030414322815\r
+ 0D2534342424302626272727272727182430302727272727271B1B1B1010100B\r
+ 0B0B0B0B0B0B101010101C1C1C1C1C3030282828282727271D1D2B2B27272727\r
+ 2730303030343232322B242424243030303B3B18020404040404080D0D141F21\r
+ 212121252525323232323232362F3E3E0C000D343425252525344A4A4A4F380E\r
+ 01010101010108140D0404090908010104040A1D242424242424243232323232\r
+ 2B180F0F03031D283535351803030309142B3B30141F34391D24403427272727\r
+ 27271D24343737373737372727271B1B1010100B0B0B0B0B0B0B101010101C1C\r
+ 1C1C282828282727272727271B1A303027272727303030303939252525253030\r
+ 303037373737372B0A0202020202020808080F141F1F1F252532323232323232\r
+ 362F42400C000D323232252534464F4F4F4F460E010101010108140F04040909\r
+ 0902020202020A1D1F1F1F1F1F1F25323232323224180D030007070C3045280C\r
+ 03030D21232339433E3E464023233E3E3E302727271B1B303027273030303027\r
+ 271B1B1B1B10100B0B0B0B0B0B0B101010101C1C1C2828282828272727272727\r
+ 1B1B30302727272730302730393925252534393737373737373737371D040404\r
+ 0404040404040A0D141F1F32323232323232323232324B400C010A2B2B2B2B2B\r
+ 404D4D4D4D4545300A02020202141408020809090401010101040E1D1D131313\r
+ 1F1F1F2B2B2B2B342B130400010A03031D39270A0A0F1F1B27404D4D4E4E4E43\r
+ 39272734343434342323282827272727272727271B1B1B1B1010100B0B0B0B0B\r
+ 0B0B0B1010101C1C1C2424243030303030282828232330272727272727272730\r
+ 39393232323037373737373737373737370E040404040404040404080D131F25\r
+ 2525323232323232323E4E390C000A3232242B40464D4D4D453B3B4523040101\r
+ 0D140D020409090901010101010A18180D0A0E0E1F1F1F25252525342B0A0000\r
+ 0404000A131D1D0C0D212B1924424E4E4E4E4E4E43392C26232B343434343027\r
+ 272727272727271B1B1B1B1B1010100B0B0B0B0B0B0B0B101010101C1C282828\r
+ 2828282828282828282828282727272730303030393932322B2B2B2B30303030\r
+ 3737373737240E040404020202040404040A131F1F1F25252525253236444D37\r
+ 0C00082525253646464F4F4545453745450E02090F0F04040404090401010101\r
+ 0813130A03080A13131F1F1F2B2B2B361F0100020202020C0C0C0E0E14242727\r
+ 2B2F424E4E4E4E4E4E4E433027272324344343372727272727271B1B1B1B1B1B\r
+ 1010100B0B0B0B0B0B0B0B101010101C1C242823232828282828282828283434\r
+ 2727272727272730393934252528282828282828282837373728180D04020202\r
+ 0202020202020A131F1F25323232323236434D370C01081F3434434D4D4D4545\r
+ 4545453034340E0E0E080408080808020101010413130A0101080A13131F1F1F\r
+ 1F2525362403000404010A0A0A0A13141F1F273737303E4B4334343440404039\r
+ 30271B24303034344037272727271B1B1B1B1B1B1010100B0B0B0B0B0B0B0B10\r
+ 1010101C1C1C2823232828272727273728283434282727272731313139393425\r
+ 2B2B2B2B2B2B2B2B3737373737371B1309020202020404040404040A13131F25\r
+ 32323232324345370C010A1F3939464D4D454545454530242440401A09040808\r
+ 080802010101010A130D010101030A0E0E1F1F1F1F1F25362B07010303070E08\r
+ 08080D131F1F1F303030434B3E1B1B2737373737271D1D282828282834404040\r
+ 2727271B1B1B1B101010100B0B0B0B0B0B0B0B101010101C1C1C28281D243027\r
+ 27273030272734343430302C2C37373737392B2B303030303030303037373737\r
+ 373D37180E08020202040404040404040A0A141F32323232324040370E020D25\r
+ 464D4D4D4545454545371D1D25404F390E040909090401010101041313020202\r
+ 0203030A13131F1F1F1F1F32320E0000040D0D010808080E0E0E141F24344B4E\r
+ 341B2727373737271D1D283737272727273039393939271B1B1B1B101010100B\r
+ 0B0B0B0B0B0B0B101010101C1C1C28281D2430272727303027272B3434343430\r
+ 303939373739342530303030303030303737373737374527130D040102020504\r
+ 02020202020A131F1F322525253445370E040E344D4D4D4545454545451B151F\r
+ 34404A4A30130D0D0801010101010F1408010101010101080E0E1F1F1F1F1F1F\r
+ 341300000D0D030308080808080F0F14141F32362B2323373737271D1D283737\r
+ 3727272727272727392B2B2B231B1B101010100B0B0B0B0B0B0B0B101010101C\r
+ 1C1C28281B1B3428282828372823283432323234343434373739343428283030\r
+ 3030303030303737373745341B130A01010404040202020404040A131F252525\r
+ 253434300E08254D564D393941454545300C15243945454545391D0A04040101\r
+ 010D140D02010101010101030A131F1F1F1F1F1F321801041308000404040401\r
+ 010A0E141414141F1F1F24303030231D273737272727272727272723231D1D28\r
+ 281C1C101010100B0B0B0B0B0B0B0B101010101C2424243023182B3030272737\r
+ 3727273434253232323230303939342B2B313030303131313131313939392B2B\r
+ 2B27130401010404040404040404040A1321212525323428181A46564D34343D\r
+ 3D3D45451506153446453737454A4018040404010A1F0E020202020201010101\r
+ 0A131F1F1F1F1F1F251F0A0A0A0101080808020000030A0F141F1F1F1F1F1F25\r
+ 34241D2B3737372B2B2B2B2B2B2B2B242424242424241B1B1010100B0B0B0B0B\r
+ 0B0B0B1010101C1C1C1C1C302318213434282828373728343434343434343431\r
+ 3139343030303037373737373737373737231F25393B28180701010505020202\r
+ 020202080E1F25323232343434434D4D3424343D3D3D3D2806031540463D3D3D\r
+ 3D4646371B0E08081318030101010101010101010A141F1F1F1F1F1F1F251D0A\r
+ 0301040404040101010103080F141F1F1F1F1F1F25252B2B3232323232322121\r
+ 21212121242427271B1B1B1B1010100B0B0B0B0B0B0B0B1010101C1C1C282828\r
+ 2818143634342B2B373727303934342B2B2B2B35354034343030303737373737\r
+ 3737373723182134373737372408020404040404040404040A141F2525253434\r
+ 464D341A2525343B3B453B1503031839393939393939454537231818180D0401\r
+ 01010103030303030D131F1F1F1F1F1F1F2B1F07010108080802010101010108\r
+ 0E141F1F1F1F1F1F2B342B21212121212121212121212B2B27272727271B1B1B\r
+ 1010100B0B0B0B0B0B0B0B1010101C1C1C28282828150E343434343434303030\r
+ 3934323232323030303934343131373737373737373737371518213437373737\r
+ 391804040404040404040404080E1F1F2525323446390A0A252539414145370C\r
+ 030A1834393939393939394545372B2B1D0E0D04040403030303030A0F0F141F\r
+ 1F1F1F1F1F251F0701080404040101010101010813131F1F1F1F1F1F34341F1F\r
+ 1F1F1F1F1F1F1F1F2430302727272727271B1B1B1010100B0B0B0B0B0B0B0B10\r
+ 10101C1C1C282828281B0C253432323232322B2B3434342B2B2B2B3535393930\r
+ 30303030373737373737371B0C1F25303030303737371B070404040404040404\r
+ 0808131F25252534340E01082434394141452706031313153745393939393939\r
+ 45372424241313130A0D0D0D0D0D0D131414141F1F1F1F1F1F321F0A03080404\r
+ 04010404040404080A13131F1F1F1F343424242424242424241F1F3230302727\r
+ 27272727271B1B1B1010100B0B0B0B0B0B0B0B1010101C1C1C28282837230A1F\r
+ 3632323232322B2B30343425252530303039393030303030303030303737270C\r
+ 0C1F253030373737374545280C04040404040404080808131F1F1F322B0A0008\r
+ 1F343741414115030E180A062345393939373737402B2B2B37241D1313131313\r
+ 131314141414141F1F1F1F1F1F252513080808080404040403030303080D131F\r
+ 1F1F34342B2B2B2B2B2B1F1F1F1F32303027272727272727271B1B1B1010100B\r
+ 0B0B0B0B0B0B0B1010101C1C1C28282837280C0D323232323232282837392B2B\r
+ 2B343030303939303030313131313137373715030A1F32393737373737374545\r
+ 30130A08040404080808080D141F1F25251803031434394149370C0C1F0A0101\r
+ 18394539373737372B2525373737372514141313131313131414141F1F1F1F1F\r
+ 1F1F321F0A0A0D080404040101010303030A13131F1F1F1F1F252525251F1F1F\r
+ 1F32302727272727272727271B1B1B1B1010100B0B0B0B0B0B0B0B1010101C1C\r
+ 1C28282837370C04253434323232303030393425253437373739393030303131\r
+ 3131313131270C030A18343937373737373737454537231308080808080D0D0D\r
+ 131F1F1F25240C031334394141270C1313010108081B4545373737281A243939\r
+ 394545403221141414141414141414141F1F1F1F1F1F2525130D080401010101\r
+ 01010101010813131F1F131F1F1F25252525252525302727272727272323231B\r
+ 1B1B1B1B1010100B0B0B0B0B0B0B101010101C1C1C1C2828283718011A343434\r
+ 343430303039342B2B34373737373939283030303030303037150303030C3039\r
+ 3737373737373737454545301D0E0E0E0E0E131313131F1F1F321D0A13403D3D\r
+ 3D23180F03000404040A23404545301D1D244545454545464B43251A14141414\r
+ 14141414141F1F1F1F1F1F321F080202010101010101010101030D1F1F1F1F1F\r
+ 1F242424242424322B272727272723232323231B1B1B1B101010100B0B0B0B0B\r
+ 0B0B101010101C1C1C282828283723030E343434343430303039393434343737\r
+ 373739392828282828282837270C010303032439393037373737373739464545\r
+ 402514131313131313131F1F1F3232180E34454545280E0400030A040404061D\r
+ 3D30242418283D4545454544444E4D34251F1F14141F1F1F1414141F1F1F1F25\r
+ 250C0104040101010101010101030D1F251F1F1F1F2424242424322B2B202323\r
+ 232323232323231B1B1B1B101010100B0B0B0B0B0B0B101010101C1C1C1C2828\r
+ 2837300A0325342B2B2B2B313131393434343737373739393030303030303037\r
+ 2306010101010E303B3737373737373737404641402F2F2B1F1313141414141F\r
+ 1F2525250E1F404545240701010A04040A0A010618181839393937374D464342\r
+ 4B4D4D4D45302414141F1F1F1F1414141F1F1F1F251D03030303030303010101\r
+ 010313241F1F1F1F1F1F2B2B2B2B2B2B2727272723232327272727271B1B1B1B\r
+ 1010100B0B0B0B0B0B0B0B1010101C1C1C1C28282837370E010E323232323030\r
+ 3030393434343737373739393131303030303030150303030303081D37373737\r
+ 37373737373D4646433C4E4E341F14141F1F1F1F1F1F25251F1F404A451D0303\r
+ 08080308080303030A0E243939393939434E4E4E4E4E4646453737241F1F1F1F\r
+ 1F141F1F1F1F1F1F1F2B0C010101010303010101010A181F141F1F1F1F1F2B2B\r
+ 2B2B2B27272727272727272727272727271B1B1B1010100B0B0B0B0B0B0B1010\r
+ 10101C1C1C242430303030180108253434343437282839343434343131313939\r
+ 31313030303037270C0101010103030D2B393737373737373737464E4E4B5656\r
+ 5640241F1F1F1F1F1F1F1F252525404F390C03030A030308030303080A0A1824\r
+ 3037343E4E4E4E4E4E434343393930303030241F14141F1F1F1F1F1F1F251D03\r
+ 0101010104040401030C1313131F1F1F1F1F1F25252B27272727272727272727\r
+ 27272727271B1B1B1010100B0B0B0B0B0B0B101010101C1C1C24243030303030\r
+ 03011F3434343431313131393434343131313939372730303030392306010101\r
+ 0303030A142B373737373737404D4E4E4E4E4E4E4E463930241F1F1F1F1F1F25\r
+ 2525344023060A0E08030A0A0100030A0A0A0A0A1D373E3C4E4E4B4B4B4B4D4D\r
+ 4040373737373734241F1F1F1F1F1F1F1F1F2B1803000000020202020D0D0D0D\r
+ 141F1F1F1F2525252B2B2727272727272C2C2C2727272727271B1B1B1010100B\r
+ 0B0B0B0B0B0B10101010101C1C1C2430303030300C000D343434343030303039\r
+ 3934303030303040372727303737371503030202020208080814303937373730\r
+ 3E52524B4B4E4E4E4E4D454139301F1F1F1F1F1F2525253415030A130A0A0A01\r
+ 01010808030A030308182B3E4B4B4B4E4E4E4E4E4E464040373737372B1D1313\r
+ 13141F1F1F1F25250E0301010101010A0E0A0A0E1F1F1F1F1F1F1F2530353535\r
+ 3535353535353535352C272727271B1B1B10100B0B0B0B0B0B0B0B101010101C\r
+ 1C1C1C28282828281801011F3434343030303039393430303030304037272730\r
+ 3037370C0303030303030808080A1F34393937302F4B524E4E4E4E4E4E4E4D4D\r
+ 454539241F1F1F1F1F2525251D0C06060E0E080000080801080801010408131F\r
+ 2F424B4B4343434E4E4646392834404030241D0E0E14141F1F1F1F2B2B0E0303\r
+ 0301040A0A03030E1F1F1F1F1F1F25253035373737373737372C2C2C2C2C2C2C\r
+ 27271B1B1B10100B0B0B0B0B0B0B0B101010101C1C1C1C28282828282807000D\r
+ 34343430272727393939393030303040392C2C303030230A0302020202020202\r
+ 02080F1F2B343939303E4B4B4E4E4E4E4E4E4E4E46454545342B2B1F1F1F1F25\r
+ 25250C060C0E0A0308080404040101010104040D1F2F3E3E2424404640404034\r
+ 34393939303024180E04040F1F1F1F1F32240C030303080A0300030D141F1F1F\r
+ 1F32322B272727272737373737272C2C2C2C2C272727221C1C1010100B0B0B0B\r
+ 0B0B0B101010101C1C28282828373730300E01041F3634342727273040403430\r
+ 303030393935303030301B03030303040404040404040D0D142434393737434B\r
+ 4B3E3E3E46464646464541414141302B2B1F1F1F252525180A030A0E0E040108\r
+ 040001010103030A1314212124243939393939303039392B2B30183418010104\r
+ 040F14141F3232180C0C0A0A0000080E0E1D1D1D25252B272727272727272727\r
+ 27272727272727272222221C1C1010100B0B0B0B0B0B0B1010101C1C1C1C2828\r
+ 28373728282304010D3434342727273039393430303030393937303030301503\r
+ 020202040404040404040A0A13131F323439434E4E32243145454545453B3B3B\r
+ 3B3B3B341D14141F25253232180A0A1F1F0A040401010101010104080D131314\r
+ 1F3439393940343434393030301D0E34371507070000040A0A14323636251807\r
+ 0303030D131F1F1F1F2524232323232323232323232323232727272727271C1C\r
+ 1C1010100B0B0B0B0B0B101010101C1C1C1C28282837282828280A01021F3934\r
+ 282828283939393030303030393737373737150302020202040404040404040A\r
+ 0E0E1F1F1F323E4B4B2B2B394545454545453B3B3B3B45390A03132525252525\r
+ 25252D2D2F250E0401010101010103030A0F0F141F1F25343434343434343439\r
+ 39180E2440371B0701010303030A1D3443433E321A07070D14141F1F1F2B2B1B\r
+ 1B1B1B1B1B232323232323202020202727271B1B1B1010100B0B0B0B0B0B0B10\r
+ 10101B1B1B1B28283030303030301803010F3639282823233739392828282828\r
+ 3939273030300C030202020202020202020202080A0E0E1F1F25323434343434\r
+ 344545393939393939394A3D0C01132418181F1F2525363E3E3E250F04040101\r
+ 00000303080D1313131F1F1F2532323234343434341D181D343430180E0E1818\r
+ 181F2525251814212F1D0A0A13131F1F1F24241B1B1B1B1B1B1B1B1B1B1B1B1B\r
+ 1B1B1B2727271C1C1C1010100B0B0B0B0B0B0B1010101C1C1C1C282828282828\r
+ 2828230A010425403030232330393930302727303939282828280A0302020202\r
+ 02020202040404040A0A0E0E1F25252525323434343440393939393939454545\r
+ 23071818180E0E0E1F1F24343E42422F1F14090404040404040A13131F1F1F1F\r
+ 1F1F1F1F2525252525252525252525252525251F1F3232130803030808080A0A\r
+ 0F0F1F1F1F1F231B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B272727221C1C10100B\r
+ 0B0B0B0B0B0B0B1010101C1C1C1C2424243030302424301302020D3639282828\r
+ 28393939282727273939282828230A040404040404020202040404040A0A0A13\r
+ 1F1F252525323636363636343434343434343434342B2B2B2B2B1F1F1F323232\r
+ 1F13142D2D0D05050909020202080D13131F1F1F1F1F1F1F1F1F1F2525252525\r
+ 2525323232212121211F0A030303030300030A0E0E0E1D1D24241B1B1B1B1B1B\r
+ 1B1B1B1B1B1B1B1B1B1B1B1B2222221C1C10100B0B0B0B0B0B0B101010101C1C\r
+ 1C1C242424303030232337230701021443302727303039392828232339392828\r
+ 28280A04040404040404040404040404040A0A131D1D25323232323636363636\r
+ 3636363636363636363636363632323232321F0D030303090902020202020203\r
+ 03030A0A131F1F1F1F1F1F1F1F25252521212121213232323221211F1F0A0300\r
+ 0003030000030A0A1313131F2B232323231B1B1B1B1B1B1B1B1B1B1B1B1B1B1B\r
+ 1B1B1C1C1C10100B0B0B0B0B0B0B0B1010101C1C1C1C24242424242424243030\r
+ 180202043239282828283939372727273440303030300C040404040404040404\r
+ 0404040404080A131F1F1F323234343434363636363636363636363632323232\r
+ 323232321F0D04010101010101010101010101010101080A131F1F1F1F1F1F25\r
+ 25252525252525253232323232322424180A0A0303030303030A0A0A1313131F\r
+ 2B2B2727271B1B232323231B1B1B1B1B1B1B1B1B1B1B1B1B1010100B0B0B0B0B\r
+ 0B0B0B101010101C1C1C1C282828282828232330230A01010F40302727303939\r
+ 392727273040392730300E0404040404040404040404040404040E0E141D1D25\r
+ 2534343436363636363636363636363232323232323232140801010104040404\r
+ 04020101010101010101030A0E0E1F1F1F1F1F25252525252525253232323232\r
+ 322B2B3430180D0D0A0A0A0A0A0A0A0A13131324303030272323232323231B1B\r
+ 1B1B1B1B1B1B1B1B1B1B1B1B1010100B0B0B0B0B0B0B0B101010101C1C1C2424\r
+ 2424242424242424301804020421342828282839393030272739392727270A04\r
+ 04040404040404040404040404040D0D131F1F1F323232363636363636363636\r
+ 3636323232323232321F13040101010404040202020201010101010103030308\r
+ 0D13131F1F1F1F1F252525253232323232323232303030394D391D1313131313\r
+ 0A0A0A0E0E0E1F2B373737373737272727271B1B1B1B1B1B1B1B1B2727271C1C\r
+ 1C1010100B0B0B0B0B0B10101010101C1C1C2424242424242424242430270E04\r
+ 04092B3030303039393928282828393030230A04040404040404040404040404\r
+ 0408080A131F1F1F32323236363636363636363632323232323232321F130A03\r
+ 03030304040402020202020202010101030303080D13131F1F1F1F1F1F253232\r
+ 3232323232323239393939454D4D401D13131313131313131313132B373B3B3B\r
+ 3B3B3B353535272727272727272727272727221C1C1010100B0B0B0B0B0B0B10\r
+ 1010101C1C1C2424242424242424242430301D0802021F393123233039392828\r
+ 2828393930230A040404040404040404040404040808080A13131F1F25253436\r
+ 3636363636363636363632323232341818180404040404040404040404020202\r
+ 02010101010303080A13131F1F1F1F1F1F25253434323232362B1D2440394545\r
+ 4D4D4537270E0E13131313131313132B3B3B3B3B3B3B3B3B3B3B3B3535353535\r
+ 353535352828221C1C1010100B0B0B0B0B0B0B101010101C1C1C1C2828282828\r
+ 232323232B2B2B180402092B37232328374037272727393928230A0204040404\r
+ 04040404040404040404040A0E0E1F1F25253232323636363636363636323232\r
+ 32393923230E010404040404040402020202020202010101010103080813131F\r
+ 1F1F1F1F1F3232343434343434130718404030434E463B3B3B27180D0D131313\r
+ 13131F2B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3737373737372828221C1C101010\r
+ 0B0B0B0B0B0B0B101010101C1C1C1C2828282828232323232B2B2B230C02020F\r
+ 2B2B2727304040282828283928230A040404040404040404040404040404040A\r
+ 0A131F1F2525323236363636363636363636363640454530240D020202020202\r
+ 080802020202020202010101010103030A0A131F1F1F1F1F2525323434343434\r
+ 130404131F342B3446463D3B3B3B3B230E0E13131313132B3B3B3B3B3B3B3B3B\r
+ 3B3B3B3B3B3B3B3B3B3B37373728221C1C1010100B0B0B0B0B0B0B1010101C1C\r
+ 1C1C1C28282828282823232323303023230A0104213927272330403027273039\r
+ 39230C04040404040404040404040404040404080A131F1F1F25323236363636\r
+ 363636363636364045454528180D040404040404040404040202020202010101\r
+ 010101040A0A0E141F1F1F1F252532323434320F04040A0A0A1F343E40404A45\r
+ 45454541311D0D0D1313132B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B37373737\r
+ 3722221C1C1C10100B0B0B0B0B0B0B1010101C1C1C1C1C242424243024232323\r
+ 2328282323230702092B37232323393928232834393018040404040404040404\r
+ 04040404040404080A13131F1F25253436363634343434343434454545453928\r
+ 180D040404040404040404040404040401010101010101080A0A0E141F242424\r
+ 2432323636210D0202080A0A0A13243230454545454545454C4124181313132B\r
+ 414141414141414141413B3B3B3B3B3B373737372828221C1C1C12120B0B0B0B\r
+ 0B0B0B101010101C1C1C1C2424242424242323232323302323301803010E3430\r
+ 23151D403723233039301B0A040404040404040405050505050505080A0E0E1F\r
+ 1F25253434343434343434343445454545393937180D04040404040404040404\r
+ 040404020101010101010108080D13131F1F1F25253434341F040202080D0808\r
+ 0A0E0E0E24303030394145454545453728231D2B45414141414141414141413B\r
+ 3B3B3B3B3B3B37373728281C1C1C10100B0B0B0B0B0B0B101010101C1C1C1C1D\r
+ 1D24242424232323232330242424281501021434271B0C1F393023283434230A\r
+ 04040404040404040505050404040408080D131F1F2532343434343434343434\r
+ 4545454545244545180D08010404040404040202020202020201010101010308\r
+ 0A0A13131F1F252534343424080104090F0802020A0A0A131F1F1F2424303039\r
+ 393939454537243443464541414141414141413B3B3B3B3B3B3B37373728281C\r
+ 1C1010100B0B0B0B0B0B0B101010101B1B1B1D1D1D1D1D1D242424241D1D2B2B\r
+ 232323230E02082B37271509243928283434230C040404040404040404040404\r
+ 04040808080D131F1F253434343434343434344045454545301C4545230E0A01\r
+ 04040404040402020202020202020101010101080A0A13131F1F2B2B3443340C\r
+ 0208080F0902020A04040A13131D1D1D24242424242424243234373943434545\r
+ 41414141414141413B3B3B3B3B3B37373728281C1C1C10100B0B0B0B0B0B0B10\r
+ 1010101C1C1D1D1D1D1D1D1D242424242424242424242424240C020D3430300A\r
+ 092530232B39300C04050505040404040404040404040408080E0E1F1F252534\r
+ 3434343434344045454545453939454537180D02020404040402020202020202\r
+ 02020203030303030A0E0E1F1F2525253643300C0404040404040D0801030A0E\r
+ 0E1D1D24242421212121212134343B3B3B3B45454545453B3B3B3B3B3B3B3B3B\r
+ 3B3B3B313128281C1C1C10100B0B0B0B0B0B0B101010102424181D1D1D1D1D1D\r
+ 24242323232323303023232323230A041434301B051434272439391504050505\r
+ 0404040404040404040404040A0E0E1F1F253434343434343440454545454539\r
+ 3945454545280E0303030308040404020202010101010101040408080D13131F\r
+ 1F1F252532403715020208040408080202030A0A131D1D252525252525252539\r
+ 454141414141413B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B313128281C1C1C1010\r
+ 0B0B0B0B0B0B0B101010101C1C1D1D1D1D1D1D1D24242323232323232B2B2B2B\r
+ 2B2B1D0A042430300E091F372334401B03040404040404040404040404080808\r
+ 080D131F1F25343434343434394545454545453945454545493B180801010104\r
+ 0404010101010101010101010104040A0E141F1F1F3232323439391D01040404\r
+ 080802020203080A131D1D253232323232323945454141414141414141413B3B\r
+ 3B3B3B3B3B3B3B3B3B3B3B313128281C1C1C10100B0B0B0B0B0B0B1010101018\r
+ 181818181D1D1D1D1D2B2323232323232B2B2B23232323230C0A2430230C0D2B\r
+ 2B2B40300A040505050404040404040404040408080D131F1F25343434343434\r
+ 4545454545454545454545454545341A03030303030303030303010101010103\r
+ 0303030A0E141F1F2B2B3434393939240C040404080401020202030A131F1F25\r
+ 32323232344045454545454141413B3B3B3B3B3B3B3B3B4141413B3B3B3B3B37\r
+ 372828281C1C12120B0B0B0B0B0B0B0B10101018181818181D24242424242424\r
+ 242424242B2B2B2B23232323230C1325301D0E18302434391802020505050505\r
+ 0504040404040404080A131F1F25252525253439454545454545454545454545\r
+ 39344030040303030303040404040101010101040303030A13131F1F2B323640\r
+ 3B302B3423040408040101040404030A131F1F1F323232344045454545454141\r
+ 413B3B3B3B3B3B3B3B3B3B414141414141414137372828281C1C12120B0B0B0B\r
+ 0B0B0B0B0B101018181818182323232323232323232424242430242323232323\r
+ 232318182B2B1B1B34282436240A0404040404040404040404040404040A131F\r
+ 1F2525252525343D454545454545454545454537252545390A03030303030303\r
+ 03030101010104030303080A131F1F252534344537151A3630180D0401010104\r
+ 040101030E1D2424243234404545454545414141414141414141414141414141\r
+ 414141414141413B313128281C1C12120B0B0B0B0B0B0B0B1010101010101D1D\r
+ 1D2424232323232323242424243030232323232323232318243023233439212F\r
+ 30180D05040404040404040404040404080D13131F3232323234394545454545\r
+ 393945454545271D253945452303030303030303030303030303030303030A0E\r
+ 1D1D242434343945230C1A3439391D0401010101010101030E1D1D1D25253945\r
+ 4545454545454545414141414141414141414141414141414141413B3131281C\r
+ 1C1C12120B0B0B0B0B0B0B0B101010101010101D1D1D24232323232323232323\r
+ 2330302323231D1D1D1D24232334301D2439323239270E040404040404040404\r
+ 08080808080D13131F252525253945454545453B3B3B454545280A14343D3D3D\r
+ 451B0A0A040303030303030303030303030A0A141F1F1F25343445370C0C2439\r
+ 45453713030303030303030313131F1F24344545454545454545454545414141\r
+ 414141414141414141414141414141373728281C1C1C12120B0B0B0B0B0B0B0B\r
+ 0B101010101313131D1D1D1D1D1D242423232323232330231D1D1D1D1D1D2424\r
+ 242439231D25363434371B0A040404040808080808080404080D13131F252525\r
+ 34394545454545373D3D3D3D370C0C243939454545451B0C0803030303030303\r
+ 08080808080E0E1F1F2525253440492302022445454545240E0A0A030303030A\r
+ 13131F1F34454545454545454545414141414141414141414141414141414141\r
+ 414141373728281C1C1C12120B0B0B0B0B0B0B0B0B0E0E0E0E13131313131D1D\r
+ 1D1D1D24241D23232323232323231D1D1D1D2323232332300C1F3E343434270C\r
+ 0A0A040404040409080404040A0E0E1F1F252525343D45454545393939454545\r
+ 23060C2B40454545454C37180A0707070703030A0A0A0A0A13131F1F1F242424\r
+ 39454518010113454C3D3D3D1D13130A0A0A0A0A13131F2B3945454545454545\r
+ 4141414141414141414141414141414141414141414141373728281C1C1C1212\r
+ 0B0B0B0B0B0B0B0B0B0E0E0E0E13131313181D23232323232323232323232323\r
+ 23231D1D1D1D1D1D1D1D1D24151432393030301B0E0E08040404040404080808\r
+ 080F0F1F1F32323239454545454537373D3D45300C030A2B4545454539454537\r
+ 180A0A0A0A0A0A0A0A0A0A0E0E1F1F1F1F1F25254045450C03030A2445454541\r
+ 391F13131313131313131F2B4045454545454545414141414141414141414141\r
+ 4141414141414141414137373728281C1C1C12120B0B0B0B0B0B0B0B0B0E0E0E\r
+ 0E131313131D232323232323232323232323232B2B23231D1D1D1D1D1D1D1D1D\r
+ 1D3221343434303024130A0A0A0A0A04040408080D0D141F2525253440403D3D\r
+ 3D3D37373745452303030324454545453945454530180C130E0E0E0E0E0E0E0E\r
+ 1F1F1F1F1F25252539493B0A0408080C2B454541464324131313131313131F34\r
+ 454545454545454141413B3B3B3B414141414141414141414141414141413737\r
+ 3728281C1C1C10100B0B0B0B0B0B0B0B0B101010131313131D1D232323232323\r
+ 23232323231D1D24241D1D1D181818181818180A13362B2434342B2B2B230E0A\r
+ 0A0A0A0A030303080A131321212B323939454537373737373745370C03030318\r
+ 4545454545394C4C4C391D1313131313131313131F1F1F1F1F32322B3745300A\r
+ 040908030E304545464D3923130F131313131F394541414141414141413B3B3B\r
+ 3B3B3B3B3B3B41414141414141414141413737373728281C1C1C10100B0B0B0B\r
+ 0B0B0B0B1010101010181818232323232323232323232323231D1D1D241D1D1D\r
+ 1D18181818180C03081F39242434343030301D1D0E0A0A0A0A0808080D131F25\r
+ 252525253D45454537373737374028060101030A374C454545394545454D341F\r
+ 1F1F1F1F1F1F1F1F1F242424242434394141270A0A0802020218303043464137\r
+ 281A1313131324404541414141414141414141413B3B3B3B3B3B414141414141\r
+ 41414141413737373728281C1C1C10100B0B0B0B0B0B0B0B101010101010101D\r
+ 1D1D23232323232323232323232318181D1D18181818181818180A03030D2434\r
+ 2B2B343427272724140F0F0A0A0A0A0A13131F25253224243745454539393939\r
+ 39391B03030303031845454545374545454D4D40241F1F1F1F1F1F1F24242424\r
+ 242434454545280C04040101010A182B40403B3B45391D131313243D45414141\r
+ 414141414141414141414141414141414141414141414141414137373728281C\r
+ 1C1C10100B0B0B0B0B0B0B0B1010101010101010101D1D232323232323232323\r
+ 2323231818241818131313131D130404040A132B3434343428282828251F1413\r
+ 1313131313141F25253234373737453737414141413715030303030303234545\r
+ 45453945454D564D2B2B1F1F1F1F1F1F1F1F1F2B2B2B34454545280A01010101\r
+ 0108132534343B4545453B2318132441414141414141414141413B3B3B3B3B41\r
+ 414141414141414141414141413737373728281C1C1C10100B0B0B0B0B0B0B0B\r
+ 101010101010101010101D2323232323232323232323231818241D1813131313\r
+ 130C03030808131D2B34283434272730432F1F1F1F1F1F1F1F1F1F2525254045\r
+ 373739393941414141370C0000030308080C284545453939464E4E392439341F\r
+ 1F1F1F1F24242424242439454539280A03040404040A0E0E14253939393B3B3B\r
+ 28131F45414141414141414141413B3B3B3B3B41414141414141414141414141\r
+ 413737373728281C1C1C10100B0B0B0B0B0B0B0B0B1010101818181818181823\r
+ 231D1D1D1D2323232323231818181D1313131313130A03030808131D1D243434\r
+ 342823344E4E321F1F1F1F1F1F1F1F1F32323939373737373B3B3B3B45270600\r
+ 010101010A0A15304545373446564637374545341F1F1F1F1F1F1F2525253941\r
+ 3730300C08080808080D0D0E1824323234343434342424434541413B3B3B3B3B\r
+ 3B3B3B3B3B3B3B414141413B3B3B41414141413B3B3B3B373728281C1C1C1010\r
+ 0B0B0B0B0B0B0B0B1010101018181818181818181D1D1D1D1D1D24241D181818\r
+ 18181D1D131313181808030303080F1F1F1F253440392343564634251F1F1F1F\r
+ 1F1F1F1F323239414130303D3D3D3D3D4527030001010101080808133445452B\r
+ 434E3931454545454525251F1F1F1F2525344545373737070404040404040404\r
+ 0A1F1F1F25323232323939393B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B4141413B\r
+ 3B3B3B4141414141414141373728281C1C1C10100B0B0B0B0B0B0B0B10101010\r
+ 181818181D1D1D1D1D1D181818181D1D181818181818181D1313131818040404\r
+ 040409141F23232334242448564528282B1F21211F1F1F1F3232394141303045\r
+ 45454545452303010101010404040A0F1D30463E3E3E46464C41414141413421\r
+ 21212B2B253445453939410C020205040401030308131F21212121343941413B\r
+ 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B41414141414141414137\r
+ 3728281C1C1C12120B0B0B0B0B0B0B0B10101010131313131D1D1D1D1D1D1D18\r
+ 18181818181818181818181D181818180E0804040404040D142B2B231A1A4352\r
+ 4E402727302B211F1F1F1F1F323237414131314545454545452703030404040A\r
+ 0A0A0A13132436424246464D4D4D454541414140322121212134454539394923\r
+ 0102050202020303030C1D212125343D4141413B3B3B3B3B3B3B3B3B3B3B3B3B\r
+ 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3131281C1C1C10100B0B0B0B\r
+ 0B0B0B0B10101010101313131313131818181818181818181818181818181818\r
+ 181818180C040404040404080F1F322B232B4B4B43433928282828251F1F1F1F\r
+ 323437414137373D4545454545270A040808080D0A0A0A0A131F1F323E45454F\r
+ 4F4F4F454545454C4C403232253434283D3D493B0C02020101010101030A1321\r
+ 323941414141414141413B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B\r
+ 3B3B3B3B3B3737373728281C1C1C10100B0B0B0B0B0B0B0B0B0E0E0E13131313\r
+ 131313131318181818181818180E0E0E0E181818181818180C04040404080808\r
+ 08132132304342363446463939393939251F1F25253439393939393945453737\r
+ 37230A04040404040404040A0E0E0E1F253439393B4545454545454949494940\r
+ 32323224304141492303010101010101040A1324344141414141414141413B3B\r
+ 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3737373728281C\r
+ 1C1C10100B0B0B0B0B0B0B0B1010101013131313131313131313130E0E0E0E0E\r
+ 0E0E0E0E131313131D1D1D1D0A040404040404040A0D142525363636373D3D3D\r
+ 394040404032212121343B3B3B3B393939393939392707010101010101040404\r
+ 040A13131F25252530303939454545454545454534343E3E2437414141150101\r
+ 0101010103080E24394141414141414141413B3B3B3B3B3B3B3B3B3B3B3B3B3B\r
+ 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B313122221C1C10100B0B0B0B0B0B0B10\r
+ 1010101313131313131313131313130E0E0E0E0E0E0E0E0E0E0E0E181D1D1D1D\r
+ 0A040404040404040808131F1F25253434343030303B39394545342121343930\r
+ 39393939393939454C300601010101040408040103080E0E1F1F252525253434\r
+ 343434343434343434344343433B3B3B493B0C010101010101030E2437413B3B\r
+ 3B41414141414141414141414141414141413B3B3B3B3B3B3B3B3B3B3B3B3B3B\r
+ 3B3B3B3B313122221C1C10100B0B0B0B0B0B0B10101010131313131313131313\r
+ 1313130E0E0E0E0E13131313131313181824241D0A0404040404040808080D14\r
+ 1F1F25323232322B34373737374539343434341D1D394545454545454C300701\r
+ 010104090902020202080A131D1D2525253434343434343232323434343D4141\r
+ 4643393B3B41350C0202020203030E2B41413B3B3B4141414145414141414141\r
+ 4141414141413B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B313122221C1C1010\r
+ 0B0B0B0B0B0B0B101010101313131313131313131313130E0E0E0E0E0E181818\r
+ 18181818182424180A040404040404080808080F141F1F252525253234343434\r
+ 3434343434344B3627374545454545454535070102020808040202020202080E\r
+ 181F25323232323232323232323945393945454541393939393B3B3414070104\r
+ 0404133041414141414141414141414141414141414141413B3B3B3B3B3B3B3B\r
+ 3B3B3B3B3B3B3B3B3B3B3B3B313122221C1C10100B0B0B0B0B0B0B0B10101010\r
+ 131313131313131313131313130E0E0E0E181818181818181824241B0A040404\r
+ 040404040404080D13131F1F2525323232323232323232323737434B433B3B45\r
+ 454545454C370A0108080404040404040404040C131D25323232323232323232\r
+ 40403B3B414141413945453B3B3B3B3636280C020203183741413B3B3B3B3B41\r
+ 41414141414141414141413B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B\r
+ 313122221C1010100B0B0B0B0B0B0B0B10101010131313131313131313131313\r
+ 130E0E0E0E0E0E0E181818181D1D28230A04040405050505050508080F0F141F\r
+ 253232323232323221212B2B3737374040404041414141454C41150308020202\r
+ 0202020202030A0A0E1F1F2B3232323232323639394137374141413728284045\r
+ 453B30364545371B07030C37413B3B3B3B3B3B3B3B3B3B414141414141414141\r
+ 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B373728281C1C1010100B0B0B0B\r
+ 0B0B0B0B0B101010101013131313131313131313130E0E0E0E0E0E0E18181B1B\r
+ 1B1B2B2B0C040404050505050404040808131414212121323232323232323131\r
+ 373737373939393D3D3D374545451B030303030302020202020808080C131F1F\r
+ 252532323236393941373741413B3B3B37232B2B2B3940404141414127151834\r
+ 3D3B3B3B3B3B41414141414141414141414141413B3B3B3B3B3B3B3B3B3B3B3B\r
+ 3B3B3B3B3B3B3B313128281C1C1010100B0B0B0B0B0B0B0B0B10101018181818\r
+ 181313131313131313130E0E0E0E181818182323232323281504040405050505\r
+ 04040404080F14141F252532323232322B3037373737373737373D4545454539\r
+ 393924030101030303030303030A03030A131F1F3232343436363B3B3B373741\r
+ 413737373737271D131F3636414141373737283434373B3B3B3B414141414141\r
+ 41414141414141413B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B313128281C\r
+ 1C1010100B0B0B0B0B0B0B0B1010101018181818181813131313131313131313\r
+ 13131818181823232323232318070404050505050404040409090F141F1F2525\r
+ 252525253030303037373737373D3D45454545393939340C0101010102020202\r
+ 040404040A131F1F32323236364545453939414137373737373737371B0D0D1F\r
+ 2B3737373737373737373B3B3B3B3B3B3B3B3B3B414141414141414141414141\r
+ 414141414141413B3B3B3B3B3B3B3B373728281C1C1010100B0B0B0B0B0B0B0B\r
+ 1010101018181818181818181313130E0E0E0E0E0E0E18181818232323232323\r
+ 230C0304040404040404040808080D131F1F1F25252525303030303037373737\r
+ 3D3D3D3D45454530243440270303030303030303080404040A131F2424323234\r
+ 3D4949403945453B3B3B3B2C2C37373737180E18181830373737373737373B3B\r
+ 3B3B3B3B3B4141414141414141414141414141414141414141413B3B3B3B3B3B\r
+ 3B3B3B313128281C1C1010100B0B0B0B0B0B0B0B101010101818181818181813\r
+ 13130E0E0E0E0E0E0E0E0E1D1D1D1D1D1B1B1B24341803030505050404040408\r
+ 0808080F1F1F1F252525303030373737373737373D3D3D3D3939392314344A45\r
+ 1807070404040404080404040A131F1F25253440454545394545453B3B3B3737\r
+ 373737372834403B271B1D243437373737373B3B3B3B3B3B3B3B414141414141\r
+ 414141414141414141414141413B3B3B3B3B3B3B3B3B37372828281C1C101010\r
+ 0B0B0B0B0B0B0B0B1010101018181818181813131313131313130E0E0E0E0E1D\r
+ 1D1D1D1D1D1D1D2434240A030404040404040408080D0D0D141F2525252B2B31\r
+ 31373737373737373D3D3D3D3D45270E143445453B180E040404040404030303\r
+ 0A131F1F323239454545373741413B3B3B3B3737373737373034393537373737\r
+ 3030303B3B3B3B3B3B3B3B3B3B3B41414141414141414141414141414141413B\r
+ 3B3B3B3B3B3B3B3B3B3B37372828221C1C1010100B0B0B0B0B0B0B0B10101010\r
+ 181818181818131313131313131313131313131D1D1D1D1D1D1D1D2424241808\r
+ 0D08080404040408080D0D0D141F252525303030373737373737374545453439\r
+ 45450C0C2539454545370E0404040404040303030A131F1F3234393945453741\r
+ 4137373737373737373737373939373737373737373737373B3B3B3B3B3B3B3B\r
+ 4141414141414141414141414141414141414141414141414141414141373737\r
+ 2828221C1C1010100B0B0B0B0B0B0B0B10101010181818181813131313131313\r
+ 1818181818181818241D1D1D1D1D181F2424240E0E0808080808080808080D0D\r
+ 141F2525253030373737373737374545453039454528030C344040454545300A\r
+ 03030303030303070C181F252534394141414141373737373737373737373737\r
+ 3939353535373737373737373B3B3B3B3B414141414141414141414141414141\r
+ 414141414141414141414141413B3B3B3B3B37372727221C1C1010100B0B0B0B\r
+ 0B0B0B0B10101010181818180E0E1818180E0E0E181818181818181824241818\r
+ 18180E1F2424241D0E0808080808080808080D0D141F1F253030303737373737\r
+ 3737454539394545450C010E40404040454545240A0A0A0A0A0A0A0E181F2525\r
+ 2539414141373737373737373737373737373737343737373535353737373737\r
+ 373B3B3B3B414141414141414141413B3B3B4141414141414141413B3B3B3B3B\r
+ 3B3B3B3B3B3B37372828281C1C1010100B0B0B0B0B0B0B0B1010101018181818\r
+ 180E0E181813131313131D181818181824241D1D1D150A1F2424242418180A04\r
+ 040404040A0A0D0D141F21253030303737373737373D3D33394545453007010A\r
+ 394C45394545454524130E0E0E0E18181F1F1F323445454530303737373B3B3B\r
+ 3737373737373734343535373737373737373737373B3B3B4141414141414141\r
+ 414141414141414141414141414141413B3B3B3B3B3B3B3B3B3B3B313128281C\r
+ 1C1C10100B0B0B0B0B0B0B0B0B10101018181818181313131313131313131D1D\r
+ 181818181D241D1D1D0C08182424242424241304040404080A0A0A0E141F2525\r
+ 303030373737373737373739454545451B030303234C4C393945454C43211414\r
+ 1F1F1F1F1F1F1F2B344545373737373741414137373737373737373230353737\r
+ 37373737373737373B3B3B414141414141414141414141414141414141414141\r
+ 41414141413B3B3B3B3B3B3B3B3B3B313128221C1C1010100B0B0B0B0B0B0B0B\r
+ 0B1010101818181813131313131313131818181818181D1D1D1D1D1D1D0A040E\r
+ 1D1D1D2424242413080808080808080D141F252B2B2B30373737373737373745\r
+ 454545450E0404010C404F453945454C442F251F1F1F1F1F1F1F1F3239393939\r
+ 393B3B3B45453B37373737303030303230303737373737373737373737373741\r
+ 414141414141414141414141414141414141414141414141414141413B3B3B3B\r
+ 3B3B3B37372822221C1010100B0B0B0B0B0B0B0B0B1010101018181813131313\r
+ 131313131313131D1D1D1D1D1D1D241D180A0408132323242423232F25130D0D\r
+ 0D0D0D0D131F252B2B2B39373737373737373D3D3D3D45450E040404011D4C4C\r
+ 45394545464E462B1F1F1F1F1F1F1F34404039393B3B3B3B3B45453737373728\r
+ 2828252B2B35373737373737373B3B3B3B3B3B3B3B3B454545453B3B3B3B4141\r
+ 414141414141414141414141414141413B3B3B3B3B3B3B373728281C1C101010\r
+ 0B0B0B0B0B0B0B0B0B100E0E0E0E0E0E13131313131313131313181D1D1D1D1D\r
+ 1D1D2424180A08080F1D1D1D24242444482B131313131313131F252B2B2B2B39\r
+ 37373737373D3D3D3D3D45370A0404040107304C454545454D4D4A452B1F1F1F\r
+ 1F1F1F34454531313B3B3B3B373737373737372727272430373737373737373B\r
+ 3B3B3B3B3B3B3B4141414141413B3B3B3B3B4141414141414141414141414141\r
+ 414141413B3B3B3B3B3B3B373728281C1C1C10100B0B0B0B0B0B0B0B0B0E1010\r
+ 10101313131313131313131313131D1D1D1D1D1D1D1D2424130808080D1F1F23\r
+ 2324244E4E24242414141414141424302828283737373737373B454545454530\r
+ 0704040404040E344C4530344B4D454545341F141F1F1F3445453037373D3D37\r
+ 3737373737372727272730303737373737373B3B3B3B3B3B3B3B3B3B3B414141\r
+ 3B3B3B3B3B3B3B3B3B3B4141414141414141414141414141413B3B3B3B3B3B37\r
+ 3728281C1C1C12120B0B0B0B0B0B0B0B0B0E1010101010101018181818181818\r
+ 1D1D1D1D1D1D1D1D1D1D24240E08080808131D242418364E401B1B24241F1414\r
+ 141F253030303030303939393B3B454545454530070404040404041330454543\r
+ 434537404045341F1F1F253445303039414141413B3737373727272727272737\r
+ 37373737373B3B3B3B3B3B3B3B4141413B3B3B3B3B3B3B3B3B3B3B3B3B414141\r
+ 414141414141414141414141413B3B3B3B3B3B31313122221C1C12120B0B0B0B\r
+ 0B0B0B0B0B1010101818181818131313131D1D1D1D1D1D1D1D1D1D1D1D1D1D1D\r
+ 0C0404080808132424244848281B2330302B1F14141F25303030303030393B3B\r
+ 3B3B4545454545280A05050504040404132439434D454545454545392B1F1F32\r
+ 30303D3D3D3D3D3D3D3D37372727272727272737373737373737413B3B3B3B3B\r
+ 3B4141413B3B3B3B3B3B3B3B4141414141414141414141414141414141414141\r
+ 3B3B3B3B3B3B3B313128281C1C1C10100B0B0B0B0B0B0B0B0B10101010181818\r
+ 18181818181D1D1D1D1D1D1D1D1D1D1D1D1D1D1D0E04040909080D1425344439\r
+ 2728282828282424241F1F2B2B2B2B343439393939394545454545310A040404\r
+ 0404080808131F32404545454545454949372B25343441414141414141413737\r
+ 3737372727272730303030373737413B3B3B3B3B3B3B41414141413B3B3B3B41\r
+ 41414141414141414141414141414141414141413B3B3B3B3B3B37373728281C\r
+ 1C1C10100B0B0B0B0B0B0B0B101010101018181818181D1D1D1D1D1D1D1D1D1D\r
+ 1D1D1D1818181818180808080808080D131F322B2B393928282828282824242B\r
+ 2B2B2B393939393939454545454545370C0404040404040404040F1D25343439\r
+ 39454545454545344343394545454545453B3B37373737372C2C2C2C2C2C2C37\r
+ 37373B3B3B3B3B3B3B3B41414141414141414141414141414141414141414141\r
+ 4141414141414141413B3B3B3B3B37373728281C1C1C10100B0B0B0B0B0B0B10\r
+ 10101010181818181D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1818181818180D0808\r
+ 080808080E0E1F25252534343028282828283434342430393939394545454545\r
+ 4545453B0E0404090904040404040A131F1F25343440404040404040404D4545\r
+ 4545454541414141413737373737373727272737373737373B3B3B3B3B3B3B3B\r
+ 3B3B3B3B3B4141413B3B3B4141414141414141414141414141413B3B3B3B3B3B\r
+ 3B3B37373728281C1C1C10100B0B0B0B0B0B0B10101010101A1A1D1D1D1D1D1D\r
+ 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D0D0808080808080D0D131F1F252534\r
+ 3434343434343434342B2B373737373745454545454545452304040804040404\r
+ 0404040A141F25253236363636363645454545454545454541414141413B3737\r
+ 3737313131303030373737373B3B3B3B3B3B3B3B3B3B3B3B4141413B3B3B4141\r
+ 414141414141414141414141413B3B3B3B3B373737373131313122221C1C1010\r
+ 0B0B0B0B0B0B0B0B0B0E10101010101010181818181818181D1D1D1D1D1D1818\r
+ 18232323230E090909090909090A0E1F1F323232323232323232303030393737\r
+ 373737373D4545454545454530070404090404040404040A131F252532323636\r
+ 364045454545454545454545454141413B3B3B3B373737373737373737373737\r
+ 373B3B3B3B414141414141414141414141414141414141414141414141373737\r
+ 3737373535353535353531313128281C1C1C10100B0B0B0B0B0B0B0B0B101010\r
+ 1818181818131313131D1D1D1D1D1D1D1D1D1D1D1D232323230E080909090909\r
+ 09090E141F25323232323232343737373737373737373D3D3D45454545454545\r
+ 370C040408080404040404040D141F2525323636404041414141414545454545\r
+ 45454545453B3B3B3B3B3B3B3B3737373737373737373B3B3B3B414141414141\r
+ 4141413B3B3B3B3B3B3B3B3B3B3B3B3B3B353535353535353535353535353535\r
+ 2828281C1C1C10100B0B0B0B0B0B0B0B0B1010101018181818181818181D1D1D\r
+ 1D1D1D1D1D1D1D1D1D23232323230E050808080808080D131F1F252525252534\r
+ 373737373B3B3B3D3D3D3D3D3D3D45454141414145300A040409090505050508\r
+ 08131F1F253434344545454545454541414141454545454545413B3B3B3B3B3B\r
+ 3B3B3B3B3B3535373737373737373737414141413B3B3B3B3B3B3B3B3B3B3737\r
+ 3737353535353535353535353535353535313131272722221C1C10100B0B0B0B\r
+ 0B0B0B0B101010101018181818181D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D23\r
+ 232323090909090909090909131F2525252534393737373737373D3D3D3D3D3D\r
+ 3D3D3D4545454545454527080509090404040404040A18243236364545454545\r
+ 453B3B3B3B3B45454545454545453B3B3B3B3B3B3B3B3B373737373737373737\r
+ 373737373737413B3B3B3B3B3B3B3B3B3B353535353535353535272727272735\r
+ 352C2C2C2C2C2C2C2C2222221C1C12120B0B0B0B0B0B0B101010101018181818\r
+ 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D232323301D0A0808080808080D\r
+ 131F1F252525393939373737373D3D3D45454545454545454545454545454523\r
+ 080505040404040404040E1D32364041413D3D3D3B3B3B3B3B3B454545454545\r
+ 45453B3B3B373737373737373737373737373737373737373737373737373737\r
+ 3737373737372C2C272727272727272727272727272727272727272722222222\r
+ 1C1C12120B0B0B0B0B0B0B0B0B0B10101A1A1D1D1D1D1D1D1D1D1D1D1D1D1D1D\r
+ 1D1D1D1D1D1D1D23232323301D0A040409090909131A1A212530373737373737\r
+ 3939393939454545454545454545454545454545230804040404040404040A14\r
+ 253645454545453B3B3B414141414545454545414141413B3B3B3B3B3B3B3B3B\r
+ 37373737373737373737373737373535352C2C2C2C2C2C2C2C27272727272727\r
+ 272727272727272727272727272727272727221C1C1C10100B0B0B0B0B0B0B0B\r
+ 0B0B101018181D1D1D1D1D1D1D1D1D1D1D1D181818181D1D1D1D1D2323232330\r
+ 30230F08080808080D131F252537373737373737373737373D3D454545454545\r
+ 454545454545454545230A040404040404040A14254045454545373737414141\r
+ 41414141413B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B37373737373737373535\r
+ 3535353535272727272727272727272727272727272727272727272727272727\r
+ 2727272727271C1C1C1C10100B0B0B0B0B0B0B0B0B0B0B0B0E10101010101010\r
+ 181818181818181D1D1D1D1D1D1D1D282828232328343E1F0A0808080D131F32\r
+ 3937373737373737373737373D3D4545454545454545454545454545454C300D\r
+ 0404040404040413344545454545373737373D4141413B3B3B3B3B3B3B3B3B3B\r
+ 3B3B3737373B3B3B3B3B3B373737373737373535353535353535272727272727\r
+ 2727272727272727272727272720202020272727272727272727221C1C1C1010\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B1010101818181818131313131D1D1D1D1D1D1D1D\r
+ 1D1D232323282828282F4B4F390E04040A131F343939393939393B3D3D3D3D3D\r
+ 3D3D45454145454545454545454545454545422F18040404040404133445453B\r
+ 3B3737373737373D3D3D3D3D3D37373737373737373737373737373737373737\r
+ 3737373737373737373737272727272727272727272727272727272727272727\r
+ 272727272727272727313131313122221C1C12120B0B0B0B0B0B0B0B0B0B0B0B\r
+ 1010101018181818181818181D1D1D1D1D1D1D1D1D1D2323233030272B424E57\r
+ 57371B0A0A0A1F3439393939393B3D3D3B3D3D3D3D3D3D3D4545414545454539\r
+ 4545454545403C44451B07040404040E34454537373737373737373737373737\r
+ 3737373737373737373737373737373737373737373737373737373737373727\r
+ 2727272723232323232727272727272727272C2C2C2C2C2C3535353537373737\r
+ 3728281C1C1C12120B0B0B0B0B0B0B0B0B0B0B101010101018181818181D1D1D\r
+ 1D1D1D1D1D1D1D2323231D1D23454545394242494545454515070F3439393939\r
+ 39393D3D3D3D3D3D3D3D3D3D3D45454541454545454545454543424D4A453115\r
+ 0404040E303D3D3D3D3737373737373737373737373737373737373737373737\r
+ 3737373737373535353535353535353535352727232323232323232323232323\r
+ 23232323232C2C3737373737373737373B3B3B373728281C1C1C12120B0B0B0B\r
+ 0B0B0B0B0B0B1010101010181818181D1D1D1D1D1D1D1D1D1D1D1D2323233939\r
+ 394545392F424D41414141415E39183239373737373939393D3D454545454545\r
+ 4545454545454545454545454543424D4545453B230A030A303D3D3D3D373737\r
+ 3737373737373737373737373737373737373737373737373737372727272727\r
+ 27272727272723232323232323232323232323232323232323232C2C37373737\r
+ 3B3B3B3B3B3B3B3B313122221C1C10100B0B0B0B0B0B0B0B0B0B10101010101A\r
+ 1A1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D233434342424303E48454545453B3B\r
+ 3737373739393937373737373939394545454545454545454540454545454545\r
+ 394242494545454545371B1B3440403737373731313131313137373737373737\r
+ 3737373737372727272727272727272727272727272727272723232323232323\r
+ 2323231B1B1B1B1B1B1B1B1B1B2727272737373737413B3B3B3B3B3B31312222\r
+ 1C1010100B0B0B0B0B0B0B0B0B0B0B0E10101010101010181818181818181D1D\r
+ 1D1D1D1D1D232323301313323224394F453B3737373737373737373737373737\r
+ 37373D3D454545454545454545393939394545392F424D414141414141414137\r
+ 3434373737373737373737373535353537373737373737373727272727272727\r
+ 2727272727272727272727272723232323232323231B1B1B1B1B1B1B1B232323\r
+ 23272727353737373B3B3B3B3B3B3B313128281C1C10100B0B0B0B0B0B0B0B0B\r
+ 0B0B0B10101018181818181D1D1D1D1D1D1D1D1D1D1D1D1D1D2323232345241A\r
+ 130D2556453B3B3737373737373737373737393939373D3D4545454545454545\r
+ 453D3434342424303E48454545453B3B3B3B3B3B303030302727272730303030\r
+ 3030272737373737373737272727272727272727232323232727272723232323\r
+ 231B1B1B1B1B1B1B1B1B1B1B1B1B1B1B2323232727272735373737373B3B3B3B\r
+ 373737372828281C1C1010100B0B0B0B0B0B0B0B0B0B0B10101010181818181D\r
+ 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D23234545321A252D2D2B2B343737373737\r
+ 393937373737373739393D3D454545454545454545454545301313323224394F\r
+ 453B373737373728283131312727272727272727272727272727272727313127\r
+ 27272727272723232323232323232323232323231B1B1B1B1B1B1B1B1B1B1B1B\r
+ 1B1B1B232323272727272735373737373B3B3B37373737372828281C1C101010\r
+ 0B0B0B0B0B0B0B0B0B0B1010101818181818131313131D1D1D181818181D1D1D\r
+ 1D1D23232345454246464B3E2824242437373737373737373737373737373939\r
+ 3945454545454541454545454545241A130D2556453B3B373737373737372C27\r
+ 27272723232323232323232323232323232C2C2C272323232323232323232323\r
+ 23232323231B1B1B1B1B1B1B1B1B1B1B1B1B1B23232323232323232727272727\r
+ 3737373737373737373737373728281C1C1010100B0B0B0B0B0B0B0B0B0B1010\r
+ 10101818181818181818181818181D1D1D1D1D1D1D1D2828284539424D494545\r
+ 3B3B3030373737373737373737393939373737373D3D45454545454545454545\r
+ 454545321A252D2D2B2B34373728282828282827272727272323232323232323\r
+ 2323232323232727272323232323232323232323231B1B1B1B1B1B1B1B1B1B1B\r
+ 1B1B1B1B1B1B1B23232323232323232323232335353535353535353535353535\r
+ 3528281C1C1010100B0B0B0B0B0B0B0B0B101010101018181818181D1D1D1D1D\r
+ 1D1D1D1D1D1D1D1D1D23232328453E4345453B3B3B3B3B373737373739393937\r
+ 37373737393939373D3D454545454545454545454545454246464B3E28242424\r
+ 34343030303030303027272727272727232323232323231B1B1B232323232323\r
+ 23232727272723232323231B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B2323232727\r
+ 27272727272735353535353535353535353737373728281C1C1010100B0B0B0B\r
+ 0B0B0B0B0B10101010181818181D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D232323\r
+ 45453E46453B3B3B3737373737373737373737373737373737373739453D3D3D\r
+ 3D3D3D4545454545454539424D4945453B3B3030343434313131313131303030\r
+ 30303027272323231B1B1B1B1B1B1B1B1B1B1B1B1B1B27272727272323232323\r
+ 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B2327272727272727272735353535353535\r
+ 35353535353535353128281C1C10100B0B0B0B0B0B0B0B0B0B0B0B10101A1A1D\r
+ 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D23232323233D383E403D3D3D3D37373737\r
+ 37373737373737373737373737373737373D3D45454545454545454545453E43\r
+ 45453B3B3B3B3B3737373737373737373737373737372827272723232323231B\r
+ 1B1B1B1B1B1B23232323232323272727272323232323231B1B1B1B1B1B1B1B1B\r
+ 232323272727272727272735353535353535353535353535353535352828281C\r
+ 1C1C100B0B0B0B0B0B0B0B0B0B0B0B101018181D1D1D1D1D1D1D1D1D1D1D1D1D\r
+ 1D1D1D2323232828373636393939393131282828373737313131313131313131\r
+ 3131282828393939454545454545454545453E46453B3B3B3737373737373737\r
+ 3737373737373737373737282828232323232323232323232323232323232323\r
+ 2727272727272323232323231B1B1B1B1B1B1B1B232323232727272727272727\r
+ 2727272727272C2C2C2C3737313131272222221C1C10100B0B0B0B0B0B0B0B0B\r
+ 0B0B0B101010181818181010101818181D1D1D1D1D1D1D1D2323282828252828\r
+ 282828282828282828282828282828282828282828282828282828283D45453D\r
+ 3D3D3D3D3D383E403D3D3D3D3737373731313131313131313131312828282828\r
+ 2823232323232323232323232323232323232727272727272727272323232323\r
+ 231B1B1B1B1B1B1B232323232727272727272727272727272727272727353535\r
+ 3535272727271B1B1010100B0B0B0B0B0B0B0B0B0B0B0B101010101818181818\r
+ 18131D1D1D1D1D1D1D1D1D1D2828222222252222222222222222222228282828\r
+ 282823232323222828282828282323233D454539373737373736363939393931\r
+ 3128282828282828282828282828282823232323231B1B1B1B1B1B1B1B232323\r
+ 23232323272727272727272727272323232323231B1B1B1B1B1B1B1B1B1B2727\r
+ 272727272727272727272727272727273131313131312727271B1B1B1010100B\r
+ 0B0B0B0B0B0B0B0B0B0B101010181818181823231B1B1B1B1B1B1B1B1B1B1B1B\r
+ 28281C1C1C1C1C1C1C1C1C1C1C1C1C1C22222222221B1B1B1B1B1C2222222228\r
+ 282828282828282828312828282528282828282828282828282828232323231B\r
+ 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B22222828282828282828\r
+ 282323231B1B1B1B1B1B1B1B1B1B1B1B1B222828282828282828282828282828\r
+ 2828282831313128282828281C1C1C1C1010100B0B0B0B0B0B0B0B0B0B0B1010\r
+ 1010181818181B1B1B1B1B1B1B18181818181818232323231B1B1B1B1B1B1B1B\r
+ 1B1B1B1B1C1C1C1B1B1B18181818181818181822282828282828232323222222\r
+ 22252222222222222222222222221B1B1B1B1B1B1B1B1B1B1818181818181818\r
+ 181B1B1B1B1B1B1B2222222222222222222222222222221B1B1B1B1B1B181818\r
+ 18181C2222222228282828282828282828282828282828282828282822222222\r
+ 1C1C1C1C1010100B0B0B0B0B0B0B0B0B0B101010101018181818181818181818\r
+ 18181818181818181B1B1B1B1B1B1B1B1B181818181818181010101010101010\r
+ 101010101010181C22222222221B1B1B1B1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C\r
+ 1B1B1B1818181818181818181818181818181818181B1B1B1B1B1B1B1B222222\r
+ 22222222222222221C1C1C1C1C1B1B1B181818181C1C1C1C2222222222222222\r
+ 2222222222222222222222222222222222221C1C1C1C1C1010100B0B0B0B0B0B\r
+ 0B0B0B0B0B10101010181818181D101010101010101010101010101018181818\r
+ 1818181818181818181818181010101010101010101010101010181818181D24\r
+ 1D1D101C1C1C1C1C1A1A10101010101010101010101010101010101010101010\r
+ 101010101010101010101B1B1B1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C\r
+ 1C1C1C1C1C101010101C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C\r
+ 1C1C1C1C1C1C1C1C1C1C101010100B0B0B0B0B0B0B0B0B0B0B0B0B10101A1A1D\r
+ 1D1D101010101010101010101010101010101010101010101010101010101010\r
+ 10101010101010101010101010101010101010101010101C1010101010101010\r
+ 1010101010101010101010101010101010101010101010101010101010101010\r
+ 10101C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1010101010101010101C\r
+ 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1010101010\r
+ 100B0B0B0B0B0B0B0B0B0B0B0B0B0B101018181D1D1D10101010101010101010\r
+ 1010101010101010101010101010101010101010101010101010101010101010\r
+ 1010101010101010101010101010101010101010101010101010101010101010\r
+ 1010101010101010101010101010101010101010101010101010101010101010\r
+ 1010101010101010101010101010101010101010101010121212121212121212\r
+ 12121210101010101010101010101010101010100B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0E1010101010101010101010101010101010101010101010101010\r
+ 10101010101010100B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B12\r
+ 1212121210101010101010101010101010101010101010101010101010101010\r
+ 1010101010101010101010101010101010101010101010101010101010101010\r
+ 1010101010101010101010101010101010101010101010101010101010101010\r
+ 1010101010100B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B101010101010101010101010100B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B\r
+ 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B}\r
+ Stretch = True\r
+ IsControl = True\r
+ end\r
+ end\r
+ object tmrAboutBox: TTimer\r
+ Enabled = False\r
+ Interval = 5000\r
+ OnTimer = tmrAboutBoxTimer\r
+ Left = 293\r
+ Top = 12\r
+ end\r
+end\r
--- /dev/null
+{\r
+ Copyright © Richard L Messeder, Down East Engineering, www.DownEastEngineering.com and others listed below\r
+ Delphi 5, 6 & 7 Version\r
+ v02.00.00 Add About.\r
+ v02.00.00 Add Exit button.\r
+ v02.00.00 Add Help.\r
+ v02.00.00 Add hotkeys for most common buttons.\r
+ v02.00.00 Add timer to load formats after form is created.\r
+ v02.00.00 Align controls on dialog.\r
+ v02.00.00 Don't permit file processing unless GPSBabel is OK.\r
+ v02.00.00 Evaluate need for memoStdErr vs. Message dialog.\r
+ v02.00.00 Include all project management and Delphi project files in upload.\r
+ v02.00.00 LoadFormatsFromGPSBabelExe: Delete unused AllocConsole.\r
+ v02.00.00 LoadFormatsFromGPSBabelExe: don't continue if GPSBabel not found.\r
+ v02.00.00 Look for GPSBabel.exe before attempting to open it.\r
+ v02.00.00 Modify to use input filename and output type to generate default output filename.\r
+ v02.00.00 Output file dialog: fill in filename and filetype, if possible.\r
+ v02.00.00 Port to Delphi 7.\r
+ v02.00.00 Process: Delete unused AllocConsole.\r
+ v02.00.00 Process: handle cases where input/output file is a dir.\r
+ v02.00.00 Process: don't allow processing null, or undefined, files.\r
+ v02.00.00 Remove unused console invocations.\r
+ v02.00.00 Remove unused variable declarations.\r
+ v02.00.00 Rewrite to eliminate 'exit;'.\r
+ v02.00.00 Sort default file types by alpha; add sort routine: CANCELLED: placed in GPSBabel.\r
+}\r
+{\r
+ Copyright (C) 2002 Josh M. McKee, mrsnazz@users.sourceforge.net\r
+\r
+ This program is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ This program is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with this program; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA\r
+}\r
+\r
+{\r
+ 1.0.2 JMc - Added LoadFormats to call the new -^ switch, to dynamically\r
+ load the supported GPSDataFormats from gpsbabel.exe.\r
+ 1.0.1 JMc - Switched to using AddFormat for populating the GPSDataFormats table\r
+ - Updated GPSDataFormats table to include currently supported GPSDataFormats\r
+ - Switched to using CreateProcess rather than WinExec, so that\r
+ we can display data from stderr to the user.\r
+ 1.0.0 JMc First release\r
+}\r
+\r
+unit GPSBabelGUIDialogU;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,\r
+ Buttons, ExtCtrls, StdCtrls, StrUtils;\r
+\r
+const\r
+ CR = chr ($0D);\r
+ LF = chr ($0A);\r
+ Tab = chr ($09);\r
+\r
+type\r
+ TGPSDataFormat = record\r
+ sType: string; // type to be passed to GPSBabel\r
+ sExt: string; // default file extension\r
+ sDesc: string; // description of format\r
+ end;\r
+\r
+ TGPSBabelGUIDialog = class (TForm)\r
+ private // invisible outside of the unit\r
+ OKtoRun: boolean;\r
+ BytesRead: DWord;\r
+ Buffer: array [0..4095] of char;\r
+ BufferIndex, TokenIndex, nFormats: integer;\r
+ sCmd, sGPSBabelMsg, sIgnoreShort: string;\r
+ Tokens: array [0..2] of string;\r
+ GPSDataFormats: array of TGPSDataFormat;\r
+ hRead, hWrite: THandle;\r
+ ProcessInfo: TProcessInformation;\r
+ SecurityAttr: TSecurityAttributes;\r
+ StartupInfo: TStartupInfo;\r
+ procedure LoadFormatsFromGPSBabelExe;\r
+ procedure PopulateCombos;\r
+ procedure PopulateDialogs;\r
+ protected // visible in the unit and in descended classes\r
+ public // visible wherever the class can be referenced\r
+ published // like public, but generates RTTI info\r
+ btnAbout: TButton;\r
+ btnExit: TButton;\r
+ btnHowTo: TButton;\r
+ btnInputFileDialog: TSpeedButton;\r
+ btnIntro: TButton;\r
+ btnOutputFileDialog: TSpeedButton;\r
+ btnProcess: TButton;\r
+ btnUseDefaultOutput: TButton;\r
+ bvlGPSBabelURI: TBevel;\r
+ cbIgnoreShort: TCheckBox;\r
+ comboInput: TComboBox;\r
+ comboOutput: TComboBox;\r
+ dlgOpenInput: TOpenDialog;\r
+ dlgSaveOutput: TSaveDialog;\r
+ eInput: TEdit;\r
+ eOutput: TEdit;\r
+ lblGPSBabelURI: TLabel;\r
+ lblInputFileName: TLabel;\r
+ lblInputFormat: TLabel;\r
+ lblOutputFileName: TLabel;\r
+ lblOutputFormat: TLabel;\r
+ TimerLoadFormats: TTimer;\r
+\r
+ procedure TimerLoadFormatsTimer(Sender: TObject);\r
+ procedure btnAboutClick(Sender: TObject);\r
+ procedure btnExitClick(Sender: TObject);\r
+ procedure btnHowToClick(Sender: TObject);\r
+ procedure btnInputFileDialogClick (Sender: TObject);\r
+ procedure btnIntroClick(Sender: TObject);\r
+ procedure btnOutputFileDialogClick (Sender: TObject);\r
+ procedure btnProcessClick (Sender: TObject);\r
+ procedure btnUseDefaultOutputClick(Sender: TObject);\r
+ end;\r
+\r
+var\r
+ GPSBabelGUIDialog: TGPSBabelGUIDialog;\r
+\r
+implementation\r
+\r
+uses AboutDialogU;\r
+\r
+{$R *.dfm}\r
+\r
+procedure TGPSBabelGUIDialog.TimerLoadFormatsTimer (Sender: TObject);\r
+// This could have been in FormCreate, but this way the form is shown\r
+// before the 'formats loaded' message.\r
+begin\r
+ TimerLoadFormats.Enabled := false;\r
+ nFormats := 0;\r
+ LoadFormatsFromGPSBabelExe;\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.LoadFormatsFromGPSBabelExe;\r
+ procedure AddFormat (sType, sExt, sDesc: string);\r
+ begin\r
+ inc (nFormats);\r
+ // changes the size of the GPSDataFormats array\r
+ // initialized at nil, so the first pass sets it to 1 row, addressed as [0]\r
+ SetLength (GPSDataFormats, nFormats);\r
+\r
+ GPSDataFormats [nFormats-1].sType := sType; // [n-1] because array is zero-based\r
+ GPSDataFormats [nFormats-1].sExt := sExt;\r
+ GPSDataFormats [nFormats-1].sDesc := sDesc;\r
+ end;\r
+\r
+begin\r
+ sCmd := 'GPSBabel -^'; // internal gpsbabel command -^\r
+\r
+ SecurityAttr.nLength := sizeof (TSECURITYATTRIBUTES);\r
+ SecurityAttr.bInheritHandle := true;\r
+ SecurityAttr.lpSecurityDescriptor := nil;\r
+\r
+ OKtoRun := false;\r
+ if CreatePipe (hRead, hWrite, @SecurityAttr, 0) then begin\r
+ FillChar (StartupInfo, Sizeof (StartupInfo), #0);\r
+ StartupInfo.cb := Sizeof (StartupInfo);\r
+ StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;\r
+ StartupInfo.wShowWindow := SW_HIDE and SW_SHOWMINNOACTIVE;\r
+ StartupInfo.hStdInput := GetStdHandle (STD_INPUT_HANDLE);\r
+ StartupInfo.hStdOutput:= hWrite;\r
+ StartupInfo.hStdError := hWrite;\r
+\r
+ if FileExists ('GPSBabel.exe') then begin\r
+ if CreateProcess (\r
+ nil, // lpApplicationName // pointer to name of executable module\r
+ // sCmd includes both the exec name and the command line parms in this call\r
+ pchar (sCmd), // lpCommandLine, // pointer to command line string\r
+ nil, // lpProcessAttributes, // pointer to process security attributes\r
+ nil, // lpThreadAttributes, // pointer to thread security attributes\r
+ true, // bInheritHandles, // handle inheritance flag\r
+ CREATE_NEW_CONSOLE, // dwCreationFlags, // creation flags\r
+ nil, // lpEnvironment, // pointer to new environment block\r
+ nil, // lpCurrentDirectory, // pointer to current directory name\r
+ StartupInfo, // lpStartupInfo, // pointer to STARTUPINFO\r
+ ProcessInfo) // lpProcessInformation // pointer to PROCESS_INFORMATION\r
+ then begin\r
+\r
+ while (WaitforSingleObject (ProcessInfo.hProcess, 0)) <> WAIT_OBJECT_0 do;\r
+\r
+ PeekNamedPipe (hRead, nil, 0, nil, @BytesRead, nil);\r
+ ReadFile (hRead, Buffer, 4096, BytesRead, nil);\r
+ // The data passed by GPSBabel.exe should exceed 1500 bytes, but this provides some slack.\r
+ // (v2.0.0) We're discussing the possibility of having some sort of byte count passed by gpsbabel,\r
+ // e.g., 'byte count=1234'; we could then check for 'byte count=', and if we don't get it\r
+ // then we know that there is an error.\r
+ if BytesRead > 1000 then begin\r
+ BufferIndex := 0;\r
+ TokenIndex := 0;\r
+ FillChar (Tokens, SizeOf(Tokens), 0);\r
+\r
+ // Process the buffer into Types, Extensions, and Descriptions\r
+ while BufferIndex < BytesRead do begin\r
+ if Buffer [BufferIndex] in [Tab,CR,LF] then // Tab between fields, CRLF between rows\r
+ inc (TokenIndex)\r
+ else\r
+ Tokens [TokenIndex] := Tokens [TokenIndex] + Buffer [BufferIndex];\r
+ if TokenIndex = 3 then begin\r
+ TokenIndex := 0;\r
+ inc (BufferIndex); // Because we point to CR and must skip the LF\r
+ AddFormat (Tokens[0], Tokens[1], Tokens[2]);\r
+ FillChar(Tokens, SizeOf (Tokens), 0);\r
+ end;\r
+ inc (BufferIndex);\r
+ end;\r
+\r
+ PopulateCombos;\r
+ PopulateDialogs;\r
+ OKtoRun := true;\r
+ MessageDlg ('GPS file formats loaded from GPSBabel.exe.', mtInformation, [mbOk], 0);\r
+ end // if BytesRead > 0\r
+ else begin\r
+ sGPSBabelMsg := copy (Buffer, 1, BytesRead);\r
+ MessageBox (0, pchar (sGPSBabelMsg),'GPSBabel Error', MB_OK);\r
+ end\r
+ end\r
+ else\r
+ MessageDlg ('Unable to execute GPSBabel.exe.', mtError, [mbOk], 0);\r
+ end\r
+ else\r
+ MessageDlg ('Can''t find GPSBabel.exe.', mtError, [mbOk], 0);\r
+\r
+ CloseHandle (hRead);\r
+ CloseHandle (hWrite);\r
+ end\r
+ else\r
+ MessageDlg ('Unable to create pipe!', mtError, [mbOk], 0);\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.PopulateCombos;\r
+var\r
+ i: integer;\r
+begin\r
+ for i:=0 to nFormats-1 do begin\r
+ comboInput.items.add (GPSDataFormats[i].sDesc);\r
+ comboOutput.items.add (GPSDataFormats[i].sDesc);\r
+ end;\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.PopulateDialogs;\r
+var\r
+ i: integer;\r
+begin\r
+ dlgOpenInput.Filter := '';\r
+ dlgSaveOutput.Filter := '';\r
+ for i:=0 to nFormats-1 do begin\r
+ if (GPSDataFormats[i].sExt<>'') then begin\r
+ dlgOpenInput.Filter := dlgOpenInput.Filter +\r
+ GPSDataFormats[i].sDesc + ' (*.' +\r
+ GPSDataFormats[i].sExt + ')|*.' +\r
+ uppercase (GPSDataFormats[i].sExt) + '|';\r
+\r
+ dlgSaveOutput.Filter := dlgSaveOutput.Filter +\r
+ GPSDataFormats[i].sDesc + ' (*.' +\r
+ GPSDataFormats[i].sExt + ')|*.' +\r
+ uppercase (GPSDataFormats[i].sExt) + '|';\r
+ end;\r
+ end;\r
+\r
+ dlgOpenInput.Filter := dlgOpenInput.Filter + 'All files (*.*)|*.*';\r
+ dlgSaveOutput.Filter := dlgSaveOutput.Filter + 'All files (*.*)|*.*';\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.btnAboutClick(Sender: TObject);\r
+begin\r
+ if AboutBox = nil then begin\r
+ Application.CreateForm (TAboutBox, AboutBox);\r
+ AboutBox.Left := (Screen.Width - AboutBox.Width) div 2;\r
+ AboutBox.Top := (Screen.Height - AboutBox.Height) div 2;\r
+ end;\r
+ AboutBox.Show;\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.btnExitClick (Sender: TObject);\r
+begin\r
+ Application.Terminate;\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.btnHowToClick(Sender: TObject);\r
+begin\r
+ MessageBox (0, PChar (\r
+ 'Begin using GPSBabelGUI by:' +CR+\r
+ ' Defining an input file. If the file has an extension that' +CR+\r
+ ' GPSBabelGUI recognizes, the format will be automatically' +CR+\r
+ ' selected.' +CR+CR+\r
+ ' If the selected input file format is not correct, select the correct' +CR+\r
+ ' format from the Format dropdown list.' +CR+CR+\r
+ ' Select an output format.' +CR+CR+\r
+ ' Select Use Default Filename.' +CR+CR+\r
+ ' GPSBabelGUI will fill in the default output directory/filename' +CR+\r
+ ' using the input directory and filename. To change it, edit the' +CR+\r
+ ' name directly or use the Save As dialog.' +CR+CR+\r
+ ' Select any options for GPSBabel to use during processing.' +CR+CR+\r
+ ' Select Process.'\r
+ ), 'How To...', MB_OK);\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.btnInputFileDialogClick (Sender: TObject);\r
+var\r
+ sExt: string;\r
+ i: integer;\r
+begin\r
+ if OKtoRun then\r
+ if dlgOpenInput.Execute then begin\r
+ eInput.Text := dlgOpenInput.filename;\r
+ sExt := uppercase (ExtractFileExt (eInput.text));\r
+ for i := 0 to nFormats-1 do\r
+ if '.' + uppercase (GPSDataFormats[i].sExt) = sExt then\r
+ comboInput.ItemIndex := i;\r
+ end;\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.btnIntroClick(Sender: TObject);\r
+begin\r
+ MessageBox (0, PChar (\r
+ 'GPSBabelGUI is simply a GUI front end for GPSBabel.exe.' +CR+CR+\r
+ 'GPSBabelGUI''s only purpose is to make it easier to call' +CR+\r
+ 'GPSBabel.exe, so it must be able to find it. The easiest' +CR+\r
+ 'way for GPSBabelGUI to find GPSBable.exe is for both of' +CR+\r
+ 'them to be in the same directory.' +CR+CR+\r
+ 'GPSBabelGUI will not permit any processing to take place' +CR+\r
+ 'if there is an error during startup, or if it cannot find' +CR+\r
+ 'GPSBabel.exe.' +CR+CR+\r
+ 'There are 3 classes of messages to expect:' +CR+Tab+\r
+ '°Errors' +CR+Tab+\r
+ '°Warnings' +CR+Tab+\r
+ '°Information' +CR+CR+\r
+ '°If you receive an Error, such as ''GPSBabel can''t be found'',' +CR+\r
+ 'something has gone seriously amiss and must be corrected' +CR+\r
+ 'before trying to run GPSBabelGUI again.' +CR+CR+\r
+ '°Warnings simply indicate that you are trying to do something' +CR+\r
+ 'out of order, such as attempting to Process before defining' +CR+\r
+ 'an input or output file.' +CR+CR+\r
+ '°Information dialogs provide you with useful information, such' +CR+\r
+ 'as letting you know that a conversion has completed.' +CR+CR+\r
+ 'The About box displays copyright information for several seconds.'\r
+ ), 'Introduction', MB_OK);\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.btnOutputFileDialogClick (Sender: TObject);\r
+var\r
+ sExt: string;\r
+ i: integer;\r
+begin\r
+ if OKtoRun then begin\r
+ dlgSaveOutput.filename := eOutput.Text;\r
+ if dlgSaveOutput.Execute then begin\r
+ eOutput.Text := dlgSaveOutput.filename;\r
+ sExt := uppercase (ExtractFileExt (eOutput.text));\r
+ for i := 0 to nFormats-1 do\r
+ if '.' + uppercase (GPSDataFormats[i].sExt) = sExt then\r
+ comboOutput.ItemIndex := i;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.btnProcessClick (Sender: TObject);\r
+var\r
+ f: file;\r
+begin\r
+ if OKtoRun then begin\r
+ if eInput.text <> '' then begin\r
+ if FileExists (eInput.text) then begin\r
+ if (comboInput.ItemIndex) > -1 then begin // Input type is selected\r
+ if ((eOutput.text <> '') and (not DirectoryExists (eOutput.text))) then begin\r
+ // The output file must exist, or else ExtractShortPathName will not function\r
+ if not FileExists (eOutput.text) then begin\r
+ system.assign (f, eOutput.text);\r
+ system.rewrite (f);\r
+ system.close (f);\r
+ end;\r
+\r
+ if (comboOutput.ItemIndex) > -1 then begin // Output type is selected\r
+ if cbIgnoreShort.checked then\r
+ sIgnoreShort := '-s'\r
+ else\r
+ sIgnoreShort := '';\r
+\r
+ // Construct the command line to execute gpsbabel.exe. ExtractShortPathName\r
+ // is used to reduce any "long" file/directory names in the paths down to\r
+ // 8.3 dos format names (this removes spaces, etc).\r
+ sCmd := 'GPSBabel '+sIgnoreShort // +'-i garmin -f usb:' // for testing\r
+ +' -i ' + GPSDataFormats [comboInput.ItemIndex].sType\r
+ +' -f ' + ExtractShortPathName (eInput.text)\r
+ +' -o ' + GPSDataFormats [comboOutput.ItemIndex].sType\r
+ +' -F ' + ExtractShortPathName (eOutput.text);\r
+\r
+ SecurityAttr.nLength := sizeof (TSECURITYATTRIBUTES);\r
+ SecurityAttr.bInheritHandle := true;\r
+ SecurityAttr.lpSecurityDescriptor := nil;\r
+\r
+ if CreatePipe (hRead, hWrite, @SecurityAttr, 0) then begin\r
+ FillChar (StartupInfo, Sizeof (StartupInfo), 0);\r
+ StartupInfo.cb := Sizeof (StartupInfo);\r
+ StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;\r
+ StartupInfo.wShowWindow := SW_HIDE and SW_SHOWMINNOACTIVE;\r
+ StartupInfo.hStdInput := GetStdHandle (STD_INPUT_HANDLE);\r
+ StartupInfo.hStdOutput:= hWrite;\r
+ StartupInfo.hStdError := hWrite;\r
+\r
+ if CreateProcess (\r
+ nil, // lpApplicationName // pointer to name of executable module\r
+ // sCmd includes both the exec name and the command line parms in this call\r
+ pchar (sCmd), // lpCommandLine, // pointer to command line string\r
+ nil, // lpProcessAttributes, // pointer to process security attributes\r
+ nil, // lpThreadAttributes, // pointer to thread security attributes\r
+ true, // bInheritHandles, // handle inheritance flag\r
+ CREATE_NEW_CONSOLE, // dwCreationFlags, // creation flags\r
+ nil, // lpEnvironment, // pointer to new environment block\r
+ nil, // lpCurrentDirectory, // pointer to current directory name\r
+ StartupInfo, // lpStartupInfo, // pointer to STARTUPINFO\r
+ ProcessInfo) // lpProcessInformation // pointer to PROCESS_INFORMATION\r
+ then begin\r
+\r
+ while (WaitForSingleObject (ProcessInfo.hProcess, 0)) <> WAIT_OBJECT_0 do;\r
+\r
+ PeekNamedPipe (hRead, nil, 0, nil, @BytesRead, nil);\r
+ if BytesRead > 0 then begin // pipe not empty\r
+ ReadFile (hRead, Buffer, 4096, BytesRead, nil);\r
+ sGPSBabelMsg := copy (Buffer, 1, BytesRead);\r
+ MessageBox (0, pchar (sGPSBabelMsg),'Attention! Message from GPSBabel', MB_OK);\r
+ end\r
+ else // pipe is empty\r
+ MessageDlg ('File conversion complete.', mtInformation, [mbOk], 0);\r
+ end\r
+ else\r
+ MessageDlg ('Unable to execute GPSBabel.exe.', mtError, [mbOk], 0);\r
+\r
+ CloseHandle (hRead);\r
+ CloseHandle (hWrite);\r
+ end\r
+ else\r
+ MessageDlg ('Unable to create pipe!', mtError, [mbOk], 0);\r
+ end\r
+ else\r
+ MessageDlg ('You must select the output file format.', mtWarning, [mbOk], 0);\r
+ end\r
+ else\r
+ MessageDlg ('Output file is not defined.', mtWarning, [mbOk], 0);\r
+ end\r
+ else\r
+ MessageDlg ('You must select the input file format.', mtWarning, [mbOk], 0);\r
+ end\r
+ else\r
+ MessageDlg ('Input file was not found.', mtWarning, [mbOk], 0);\r
+ end\r
+ else\r
+ MessageDlg ('Input file is not defined.', mtWarning, [mbOk], 0);\r
+ end\r
+ else\r
+ MessageDlg ('Can''t run.', mtError, [mbOk], 0);\r
+end;\r
+\r
+procedure TGPSBabelGUIDialog.btnUseDefaultOutputClick(Sender: TObject);\r
+begin\r
+ if eInput.text <> '' then begin\r
+ if (comboOutput.ItemIndex)> -1 then // Output type is selected\r
+ eOutput.text := LeftStr (eInput.text, AnsiPos (ExtractFileExt (eInput.text), eInput.text)) +\r
+ GPSDataFormats [comboOutput.ItemIndex].sExt\r
+ else\r
+ MessageDlg ('You must select the output file format.', mtWarning, [mbOk], 0);\r
+ end\r
+ else\r
+ MessageDlg ('Input file is not defined.', mtWarning, [mbOk], 0);\r
+end;\r
+\r
+initialization\r
+end.\r